【问题标题】:Problems while trying to replace a list of tuples?尝试替换元组列表时出现问题?
【发布时间】:2016-12-13 04:33:40
【问题描述】:

我有以下元组列表:

list1 = [('the', 'a'), ('over','1'), ('quick','b'),('fox', 'c'), ('brown', 'd'), ('dog','e'), ('jumps','2')]

我正在尝试替换一些元组如下(*):

('the', 'a') -> ('the', 'ART')
('quick','b') -> ('quick','VERB')
('fox', 'c') -> ('fox', 'ANIMAL')

换句话说,list1 的元组应该这样替换:

list1 = [('the', 'ART'), ('over','1'), ('quick','VERB'),('fox', 'ANIMAL'), ('brown', 'd'), ('dog','e'), ('jumps','2')]

所以,我尝试了以下功能:

def replace_val(alist, key, value):
    return [(k,v) if (k != key) else (key, value) for (k, v) in alist]

问题是我不能在一个动作中传递来自 (*) 的所有新元组,我必须这样做:

replace_val(list1, 'the', 'ART')
replace_val(list1, 'quick', 'VERB')
replace_val(list1, 'fox', 'ANIMAL')

因此,我的问题是:如何在一个动作中有效地替换 (*) 中的所有新元组以便得到?:

[('the', 'ART'), ('over','1'), ('quick','VERB'),('fox', 'ANIMAL'), ('brown', 'd'), ('dog','e'), ('jumps','2')]

【问题讨论】:

  • 如果您的键相同,您可以使用字典而不是元组列表

标签: python python-3.x data-structures tuples itertools


【解决方案1】:

我认为这会有所帮助。

list1 = [('the', 'a'), ('over','1'), ('quick','b'),('fox', 'c'), ('brown', 'd'), ('dog','e'), ('jumps','2')]
list2 = [('the', 'a'), ('over','1'), ('quick','b'),('fox', 'c'), ('brown', 'Dog'), ('dog','e'), ('jumps','2')]
z=(dict(dict(list1),**dict(list2)).items())
print(z)

DEMO

【讨论】:

    【解决方案2】:
    list1 = [('the', 'a'), ('over','1'), ('quick','b'),('fox', 'c'), ('brown', 'd'), ('dog','e'), ('jumps','2')]
    dict1 = dict(list1)
    print(dict1)
    dict1['the'] = 'ART'
    dict1['quick'] = 'VERB'
    dict1['fox'] = 'ANIMAL'
    print(dict1)
    list2 = [i for i in dict1.items()]
    # or
    list2 = list(dict1.items())
    
    print(list2)
    

    出来:

    {'the': 'a', 'fox': 'c', 'brown': 'd', 'dog': 'e', 'quick': 'b', 'jumps': '2', 'over': '1'}
    {'the': 'ART', 'fox': 'ANIMAL', 'brown': 'd', 'dog': 'e', 'quick': 'VERB', 'jumps': '2', 'over': '1'}
    [('the', 'ART'), ('fox', 'ANIMAL'), ('brown', 'd'), ('dog', 'e'), ('quick', 'VERB'), ('jumps', '2'), ('over', '1')]
    

    【讨论】:

    • 糟糕,显然这是一个更好的解决方案。
    • 你可以用list(dict1.items())代替列表理解
    • 哪个更快?
    【解决方案3】:

    如果你想以简单明了的方式来做,这里有一个:

    >>> list1 = [('the', 'a'), ('over','1'), ('quick','b'),('fox', 'c'), ('brown', 'd'), ('dog','e'), ('jumps','2')]
    >>> 
    >>> list2 = [('the', 'ART'), ('quick', 'VERB'), ('fox', 'ANIMAL')]
    >>> 
    >>> list3 = []
    >>> d1 = dict(list1)
    >>> d2 = dict(list2)
    >>> 
    >>> for k in d1:
            if k not in d2:
                list3.append((k, d1[k]))
            else :
                list3.append((k, d2[k]))
    
    
    >>> list3
    [('jumps', '2'), ('dog', 'e'), ('brown', 'd'), ('the', 'ART'), ('fox', 'ANIMAL'), ('over', '1'), ('quick', 'VERB')]
    

    从您的元组列表中创建一个字典将使查找两个列表变得非常快速和容易,然后您所要做的就是获取与您的搜索条件匹配的相应值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多