python - 如果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 中是否有更有效的方法来做到这一点。
如果需要,我很乐意提供更多详细信息。
解决方案
将公共元素用作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)
推荐阅读
- java - URLConnection inputStream 返回“Busy”为什么?
- java - 从 SwingWorker 线程返回数组到主线程
- r - nlme 中的多重随机效应
- sql - 表“test.grouped”不存在
- python - 分隔符问题,pd.read_csv
- gitlab - 使用 gitlab.com 托管的 Gitlab,如何在 Prometheus 中获取诸如“提交次数”之类的指标?
- hyperledger-fabric - 我们可以自定义交易类型或在链码中添加一些代码格式来阻止以确定交易类型吗?
- reporting-services - Power BI:关于隐私问题的建议
- python - 从 seaborn 图中删除图例标题
- python-3.x - 如何使用 Python API 知道我在 Firestore 中有哪些集合