首页 > 解决方案 > 如果python中的每个列表中都存在一个元素,如何有效地连接列表

问题描述

我有 3 个列表如下。

mylist1 = [["present", [1,1,1]], ["trip", [1,1,1]], ["money", [1,8,6]], ["food", [6,6,6]], ["dog", [8,6,2]]]
mylist2 = [["cat", [8,8,8]], ["trip", [5,2,8]], ["present", [8,2,6]], ["parrot", [5]], ["dogs", [8]]]
mylist3 = [["dog", [8,5]], ["trip", [8]], ["present", [6]], ["tree", [6]], ["dogs", [8]]]

我想识别所有三个列表共有的单词并将它们的值合并到一个列表中。

所以,我的输出应该如下。

[["present", [[1,1,1], [8,2,6], [6]]], ["trip", [[1,1,1], [5,2,8], [8]]]]

我目前正在这样做。

lists = [mylist1, mylist2, mylist3]
mywords = []
for mylist in lists:
   for item in mylist:
     mywords.append(item[0])

my_new_list = []
for word in mywords:
   myflag = 1
   myvalues = []
   for mylist in lists:
     mytemp = []
     for item in mylist:
       if word == item[0]:
         mytemp = item[1]
         myvalues.append(mytemp)

     if len(mytemp) == 0:
         myflag = 0

   if myflag != 0:
     my_new_list.append([word,myvalues])

但是,当我在每个列表中有大约 10000 个元素并且需要几个小时才能运行时,这确实是低效的。我想知道在 python 中是否有更有效的方法来做到这一点。

如果需要,我很乐意提供更多详细信息。

标签: python

解决方案


将公共元素用作defaultdict包含要合并的值的列表中的键。
假设公共元素在列表中出现的次数不超过一次,即没有重复项,并且鉴于您希望它出现在每个列表中,这意味着合并列表中的元素数量必须相等与列表的数量;每个列表一个元素。

from collections import defaultdict
d = defaultdict(list)
for L in lists:
    for k, v in L: 
        d[k].append(v)
output = [[k, v] for k, v in d.items() if len(v) == len(lists)]

如果要验证没有重复的假设,可以使用Counter

from collections import Counter
from operator import itemgetter
for L in lists:
    c = Counter(map(itemgetter(0), L)).values()
    if any(v > 1 for v in c.values()):
        print('Invalid list:', L)

推荐阅读