使用python比较不同列表中的元素

使用python比较不同列表中的元素,python,list,compare,Python,List,Compare,我使用以下脚本生成了两个多组件列表: list1 = list() for line in infile1.readlines(): list1.append(line.split('\t')) list2 = list() for line in infile2.readlines(): list2.append(line.split(‘\t’)) 列表如下所示: list1 = ('1960', 'chr17', '+', 'RNF213'), ('1963', 'chr

我使用以下脚本生成了两个多组件列表:

list1 = list()
for line in infile1.readlines():
    list1.append(line.split('\t'))

list2 = list()
for line in infile2.readlines():
    list2.append(line.split(‘\t’))
列表如下所示:

list1 = ('1960', 'chr17', '+', 'RNF213'), ('1963', 'chr16', '+', 'SF3B3'), ('1964', 'chr4', '-', 'GPRIN3')...

list2 = ('1482', 'miR-K12-1'), ('1018', 'miR-K12-4-5p'), ('1960', 'miR-K12-12')...
列表1中第一个条目的第一个元素(在本例中为“1960”)将与列表2中一个或多个条目的第一个元素匹配。我想做的是找到每个匹配项,然后将list2条目的最后一个元素添加到list1条目中。所需输出的示例如下:

('1960', 'chr17', '+', 'RNF213', 'miR-K12-12')
我尝试过这个,但它没有返回任何结果:

result = []
for list1[0] in list1:
    if list1[0] == list2[0]:
        result.append((list1[0:], list2[1]))

将列表2中的值放入字典中;第一列中的每个唯一值指向第二列中的值列表。因为您有制表符分隔的值,所以您应该真正在此处使用:

dict.setdefault()
设置一个默认值(此处为列表对象),前提是该键尚未出现在字典中。这允许我们为第一个值附加到一个空列表,然后为其余值附加到已经存在的列表

现在,您可以在处理其他文件时轻松查找匹配行:

with open(filename1, 'rb') as infile1:
    reader = csv.reader(infile1, delimiter='\t')
    for row in reader:
        row += lines2.get(row[0], [])
        print row
演示:


编辑:不要使用此方法。我将不使用此方法,因为其他人可能可以从@Martijn的评论中学习

list1 = [('1960', 'chr17', '+', 'RNF213'), ('1963', 'chr16', '+', 'SF3B3'), ('1964', 'chr4', '-', 'GPRIN3')]
list2 = [('1482', 'miR-K12-1'), ('1018', 'miR-K12-4-5p'), ('1960', 'miR-K12-12')]

results = []
for x in list1:
    for y in list2:
        if x[0] == y[0]:
            results.append( x + (y[-1], ))
print results
>>>
[('1960', 'chr17', '+', 'RNF213', 'miR-K12-12')]

如果列表2中有多个匹配项,会发生什么情况?我假设如果有多个匹配项,它们都应该被追加。这样做的工作量太大了。这需要M*N个循环(其中M和N是两个列表的大小)。使用字典会给你一个M+N的解决方案;e、 按顺序在每个列表上循环一次。如果列表1的长度为10000个元素,而列表2包含5000个元素,则您的版本需要5000万次迭代。我的只有15000。谢谢你的解释。我有一些旧代码要更新!嗯,我想对“不要使用这种方法”给出+1,谢谢!我试过你的方法,效果很好。
>>> import csv
>>> list1 = ['\t'.join(r) for r in [('1960', 'chr17', '+', 'RNF213'), ('1963', 'chr16', '+', 'SF3B3'), ('1964', 'chr4', '-', 'GPRIN3')]]
>>> list2 = ['\t'.join(r) for r in [('1482', 'miR-K12-1'), ('1018', 'miR-K12-4-5p'), ('1960', 'miR-K12-12')]]
>>> lines2 = {}
>>> reader = csv.reader(list2, delimiter='\t')
>>> for row in reader:
...     lines2.setdefault(row[0], []).append(row[1])
... 
>>> lines2
{'1482': ['miR-K12-1'], '1960': ['miR-K12-12'], '1018': ['miR-K12-4-5p']}
>>> reader = csv.reader(list1, delimiter='\t')
>>> for row in reader:
...     row += lines2.get(row[0], [])
...     print row
... 
['1960', 'chr17', '+', 'RNF213', 'miR-K12-12']
['1963', 'chr16', '+', 'SF3B3']
['1964', 'chr4', '-', 'GPRIN3']
list1 = [('1960', 'chr17', '+', 'RNF213'), ('1963', 'chr16', '+', 'SF3B3'), ('1964', 'chr4', '-', 'GPRIN3')]
list2 = [('1482', 'miR-K12-1'), ('1018', 'miR-K12-4-5p'), ('1960', 'miR-K12-12')]

results = []
for x in list1:
    for y in list2:
        if x[0] == y[0]:
            results.append( x + (y[-1], ))
print results
>>>
[('1960', 'chr17', '+', 'RNF213', 'miR-K12-12')]