【问题标题】:Python - comparing values in the same dictionaryPython - 比较同一字典中的值
【发布时间】:2016-12-06 09:19:24
【问题描述】:

我有一本字典:

d = {'Trump': ['MAGA', 'FollowTheMoney'],
     'Clinton': ['dems', 'Clinton'],
     'Stein': ['FollowTheMoney', 'Atlanta']}

我想删除作为键值的字符串列表中的重复字符串。

对于这个例子,期望的结果是

update_d = {'Trump': ['MAGA'],
            'Clinton': ['dems', 'Clinton'],
            'Stein': ['Atlanta']}

有人问过here 的类似问题,但我无法根据自己的目的对其进行修改。

我的尝试:

new_d = {}
for key in d:  
    for key2 in d:
        lst = d[key]
        lst2 = d[key2]

        for string in lst:  
           for string2 in lst2:
              if string not in new_d:

我的问题是我想比较所有键的值并删除重复项。但是,我不知道如何实现这一点

【问题讨论】:

  • 抱歉,格式很糟糕。
  • 那么您拥有的代码是什么,它到底有什么问题?给minimal reproducible example,这不是代码编写服务。
  • 抱歉,尝试更新帖子

标签: python


【解决方案1】:

不像使用Counter那么优雅,但确实可以在不使用模块的情况下删除重复项:

d = {'Trump': ['MAGA', 'FollowTheMoney'],
    'Clinton': ['dems', 'Clinton'],
    'Stein': ['FollowTheMoney', 'Atlanta']}

dupvals = [item for sublist in d.values() for item in sublist] # get all values from all keys into a list
dups = [] # list to hold duplicates

for i in dupvals:
    if dupvals.count(i) > 1:
        dups.append(i)

dupvals = set(dups) # keep only one item for each duplicated item

new_d = {}

for key,values in d.items():
    for value in values:
        if not value in dupvals:
            new_d.setdefault(key, []).append(value)

print new_d # {'Clinton': ['dems', 'Clinton'], 'Trump': ['MAGA'], 'Stein': ['Atlanta']}

【讨论】:

  • 谢谢。它完美地工作。只是好奇变量“dupvals”到底做了什么。
  • 很高兴能提供帮助。对不起,我应该用 cmets 解释更多。我使用dupvals 作为list 变量来表示“所有值中的任何重复值”。它从所有键中获取所有值。然后遍历dupvals 列表以查找所有出现多次的项目。
  • 好的。看,我希望我能想出这样的东西。再次感谢您,我的解决方案不起作用,而且非常不连贯。
  • 不用担心,正如您所见,我的解决方案也很不连贯,也没有想象中的那么优雅,但它完成了工作:) 很高兴您能理解它。
【解决方案2】:

您可以使用Counter 计算每个值在d 中出现的次数。

d = {'Trump': ['MAGA', 'FollowTheMoney'],
     'Clinton': ['dems', 'Clinton'],
     'Stein': ['FollowTheMoney', 'Atlanta']}

from collections import Counter

c = Counter(x for xs in d.values() for x in xs)

在本例中,c 的值为

Counter({'Atlanta': 1,
         'Clinton': 1,
         'FollowTheMoney': 2,
         'MAGA': 1,
         'dems': 1})

然后选择计数正好为 1 的值。

update_d = {k: [v for v in vs if c[v] == 1] for k, vs in d.items()}

【讨论】:

  • 我大大压缩了字典,所以上面的例子行不通。我也不能使用任何模块来完成这项任务。我尝试使用 for 循环遍历键,但我似乎无法使用嵌套的 for 循环比较同一字典的不同值。
  • @GRAp 如果你不能在你的作业中使用Counter,我建议你考虑一下Counter是如何实现的,然后自己实现(计数部分)。这并不难。
  • 因此,对于字符串的每次出现,我都会增加一个新变量,例如 i 加 1。(i +=1)。但是我试图保留值和键之间的关系,我不知道该怎么做。
  • 您能否编辑问题以包含第二个示例来说明为什么此答案通常不起作用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
相关资源
最近更新 更多