Python,在两个列表之间映射

2024-04-25 18:52:45 发布

您现在位置:Python中文网/ 问答频道 /正文

给出了len(A)==len(B)的两个字符串列表A和B。这将导致两个列表之间的映射,定义为:A[n]->;B[n]。我们要区分以下三种类型的地图:

类型1是“1-to-m”:当至少有2个索引m和n时,使得A[m]==A[n]和B[m]!=B[n]

类型2是“m-to-1”:当至少有两个索引m和n,使得A[m]!=A[n]和B[m]==B[n]

类型3是“m-to-m”:当它同时是1-to-m和m-to-1时

1对1:既不是1对m,也不是m对1


示例:如果A=[A b A]和b=[M N M],则映射为1:1

如果A=[A b A]和b=[M N p],那么映射是1对M

如果A-M等于,那么b-M等于

如果A=[A A b]和b=[M N N],那么映射是M对M的

在两个相同长度的列表A,B之间,有没有一种清晰的方法可以找到地图的类型?你知道吗


Tags: to方法字符串gt示例类型列表len
2条回答

非常简单:构建地图!我们确定哪些键映射到每个值,哪些值映射到每个键,并查看是否有任何键或值具有多个匹配项。^{}是一种方便的方法,可以避免检查dict键是否已经有关联的集。你知道吗

import collections

def maptype(keys, values):
    forward = collections.defaultdict(set)
    backward = collections.defaultdict(set)
    for key, value in zip(keys, values):
        forward[key].add(value)
        backward[value].add(key)

    one_to_m = any(len(l) > 1 for l in forward.values())
    m_to_one = any(len(l) > 1 for l in backward.values())
    return one_to_m, m_to_one
from collections import defaultdict

def m_n(A,B):
    # use set to remove duplicate results
    x = defaultdict(lambda: set)
    y = defaultdict(lambda: set)

    [x[a].add(b) for a, b in zip(A,B)]
    [y[b].add(a) for a, b in zip(A,B)]

    m = [a for a in x if len(x[a]) > 1]
    n = [a for a in y if len(y[a]) > 1]

    if not m and not n:
        return '1-1'

    elif not m and n:
        return 'm-1'

    elif m and not n:
        return '1-m'

    else:
        return 'm-m'


assert m_n(['a', 'b', 'a'],['M', 'N', 'M']) == '1-1'
assert m_n(['a', 'b', 'a'], ['M', "N", "P"]) == '1-m'
assert m_n(['a', 'b', 'c'], ['M', "M", "P"]) == 'm-1'
assert m_n(['a', 'a', 'b'], ['M', "N", "N"]) == 'm-m'

相关问题 更多 >