我有一份清单清单:
[[10, 9, 8], [8, 7], [1, 2, 3]]
子列表的大小不一定相同。 我需要找到一个出现在两个单独列表中的数字,并返回列表索引和这些列表中的数字索引。
在这种情况下,它将是8,列表0,列表1,列表0 idx 2,列表1 idx 0。
现在我正在使用一堆for循环来做这件事,但这个速度非常慢......是否有更快的pythonic方法来实现这个目标?
答案 0 :(得分:3)
您可以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 =梳子。列表的大小)。
答案 1 :(得分:0)
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])
这可以做到它应该做的,但它似乎是一个糟糕的解决方案。