我已经使用以下脚本生成了两个多组件列表:
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')...
list1 中第一个条目的第一个元素(在本例中为“1960”)将匹配 list2 中一个或多个条目的第一个元素。我想做的是找到每个匹配项,然后将 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 中的值放入字典中;第一列中的每个唯一值都指向第二列中的值列表。因为你有制表符分隔的值,你真的应该使用 csv
module这里:
import csv
lines2 = {}
with open(filename2, 'rb') as infile2:
reader = csv.reader(infile2, delimiter='\t')
for row in reader:
lines2.setdefault(row[0], []).append(row[1])
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
演示:
>>> 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']
关于python - 使用python比较来自不同列表的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25669803/