如何在元组列表中识别部分元组匹配

时间:2019-03-27 22:52:24

标签: python dictionary tuples

如果我有一个包含元组列表的字典,如下所示:

d = {'ENSG00000186092': [('ENST00000641515', '3'),
                        ('ENST00000641515', '1'),
                        ('ENST00000641515', '2'),
                        ('ENST00000335137', '1')],
    'ENSG00000284662': [('ENST00000332831', '1')],
    'ENSG00000284733': [('ENST00000426406', '1')]}

如何确定每个键是否有元组,而元组的第一个元素不匹配,而第二个元素匹配?

例如,在上面的示例中,我们只会看到一个“ hit”,而该键是ENSG00000186092的原因,因为:

('ENST00000641515', '1')
('ENST00000335137', '1')

3 个答案:

答案 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. 遍历字典
  2. 遍历每个键的元组列表
  3. 对于每个元组,遍历相同的列表并检查以确保第一个条目不匹配,而第二个条目不匹配
  4. 如果找到任何内容,则记录第2步中的密钥。

答案 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])
  • 按元组的第二个元素然后按第一个元素对元组进行排序,以便元组按第二个元素然后按第一个元素聚在一起
  • 在排序后的列表中检查当前元组和下一个元组之间的条件,并在满足条件的情况下打印它们
  • 时间复杂度,如果dk个项目,并且列表大小为'n',则外循环为O(k*nlogn) [k nlogn用于排序]