【问题标题】:Finding an element that occurs in two lists, in a list of lists [duplicate]在列表列表中查找出现在两个列表中的元素[重复]
【发布时间】:2018-11-11 19:43:54
【问题描述】:

我有一个列表列表:

[[10, 9, 8], [8, 7], [1, 2, 3]]

子列表的大小不一定相同。 我需要找到出现在两个单独列表中的数字,并返回这些列表中的列表索引和数字索引。

在这种情况下,它将是 8,列表 0,列表 1,列表 0 idx 2,列表 1 idx 0。

现在我用一堆 for 循环来做这件事,但这太慢了……有没有更快、更 Python 的方式来实现这一点?

【问题讨论】:

  • 列表之间有多个共同值吗? [[10, 9, 8], [8, 7, 3], [1, 2, 3, 9]]
  • 您的问题含糊不清,因此您可能不会得到想要的答案。请尝试为算法添加更明确的要求。
  • 正好是 2 个?或者至少 2 个?
  • 只需要匹配两个列表,然后理想地匹配两个列表后终止
  • 一个以上的公共元素没问题,只返回其中一个

标签: python algorithm list set


【解决方案1】:

您可以enumerate 列表中的列表和项目,并将每个元素的索引元组存储在dict 中,然后过滤那些出现两次以上的条目。

lst = [[10, 9, 8], [8, 7], [1, 2, 3]]
in_list = collections.defaultdict(list)
for i, x in enumerate(lst):
    for k, y in enumerate(x):
        in_list[y].append((i, k))

res = {k: v for k, v in in_list.items() if len(v) > 1}
# {8: [(0, 2), (1, 0)]}

(假设没有元素在同一个子列表中出现多次。)

虽然这也使用“一堆 for 循环”(取决于您对“一堆”的定义),但它只会访问嵌套列表中的每个元素一次,给它 O(n) (n = comb.列表的大小)。

【讨论】:

    【解决方案2】:
    from itertools import combinations
    search = list(combinations(range(len(solutions)), 2))
    
    for i in search:
        res = list(set(solutions[i[0]]) & set(solutions[i[1]]))
        if len(res) != 0:
            save = [i, res[0]]
    
    idxList1 = solutions[save[0][0]].index(save[1])
    idxList2 = solutions[save[0][1]].index(save[1])
    

    这做了它应该做的,但它似乎是一个糟糕的解决方案。

    【讨论】:

    • 占用大量内存
    猜你喜欢
    • 1970-01-01
    • 2015-08-08
    • 2021-01-01
    • 2014-01-08
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 2017-10-18
    • 2010-10-10
    相关资源
    最近更新 更多