如果我有一个包含元组列表的字典,如下所示:
d = {'ENSG00000186092': [('ENST00000641515', '3'),
('ENST00000641515', '1'),
('ENST00000641515', '2'),
('ENST00000335137', '1')],
'ENSG00000284662': [('ENST00000332831', '1')],
'ENSG00000284733': [('ENST00000426406', '1')]}
如何确定每个键是否有元组,而元组的第一个元素不匹配,而第二个元素匹配?
例如,在上面的示例中,我们只会看到一个“ hit”,而该键是ENSG00000186092
的原因,因为:
('ENST00000641515', '1')
('ENST00000335137', '1')
答案 0 :(得分:1)
您会感兴趣的是复杂的列表理解吗?
[
k for k, v in d.items()
if any(
(i, j)
for i, j in v
for x, y in v
if i != x and j == y
)
]
>>> ['ENSG00000186092']
答案 1 :(得分:0)
非常冗长:
d = {
"ENSG00000186092": [
("ENST00000641515", "3"),
("ENST00000641515", "1"),
("ENST00000641515", "2"),
("ENST00000335137", "1"),
],
"ENSG00000284662": [("ENST00000332831", "1")],
"ENSG00000284733": [("ENST00000426406", "1")],
}
def has_duplicates(list_of_tuples):
seen = set()
for _, value in list_of_tuples:
if value in seen:
return True
seen.add(value)
return False
dupes = [key for key, value in d.items() if has_duplicates(value)]
print(dupes)
has_duplicates
函数从您的字典中获取一个值。如果该值中的任何元组具有相同的第二个值,则返回True。
返回处的列表理解为您提供了has_duplicates
为True的所有键。
答案 2 :(得分:0)
d = {'ENSG00000186092': [('ENST00000641515', '3'),
('ENST00000641515', '1'),
('ENST00000641515', '2'),
('ENST00000335137', '1')],
'ENSG00000284662': [('ENST00000332831', '1')],
'ENSG00000284733': [('ENST00000426406', '1')]}
for k, a in d.items():
a_s = sorted(a, key=lambda x: (x[1], x[0]))
for i in range(len(a_s)-1):
if a_s[i][1] == a_s[i+1][1] and a_s[i][0] != a_s[i+1][0]:
print (k, a_s[i], a_s[i+1])
d
有k
个项目,并且列表大小为'n',则外循环为O(k*nlogn)
[k
nlogn
用于排序]