【问题标题】:Comparing Sets held in a Dictionary in Python比较 Python 中字典中的集合
【发布时间】:2014-11-12 09:57:41
【问题描述】:

我有以下内容,它需要多行用户输入,例如“英语 Bob Luke”,以将一个集合存储在字典中,关于哪些人说哪种语言。我使用 Dictionary 来保存多行输入以创建多个 Set,但我现在需要比较 Set 之间的差异,看看是否有人只会说一种语言。

languages = {}
while True:
  info = input('Line: ').split()
  if info != []:
    languages[info[0]] = set(info[1:])
  else:
    break

我可以使用下面的代码打印集合,但它似乎并没有真正让我到任何地方!

for tongue in languages:
  print(set(languages[tongue]))

完全卡住了 - 任何帮助将不胜感激!

更新

这里是我想要实现的示例:

Line: English Tim Nicky James John Ben
Line: German Nicky Tim Tara
Line: Mandarin Tim John
Line: 
James is monolingual.
Tara is monolingual.
Ben is monolingual.

解决方案

完全重新采用我的方法并放弃了字典! :

english = input("Line: ").split()      
en_speakers = set(english[1:len(english)])

multi_speakers = set()

while True:
  language = input("Line: ").split()
  lan_speakers = language[1:len(language)] 
  if language == []:
    break
  else:
    multi_speakers |= set(lan_speakers)

monolinguals = en_speakers.difference(multi_speakers)

for person in monolinguals:
  print(person, 'is monolingual.')

if multi_speakers == en_speakers:
  print ('Everyone is multilingual!')

【问题讨论】:

  • 你遇到了什么错误?
  • 上面的代码没有错误,我只是不确定要添加什么来比较字典中的集合之间的差异。如果 Luke 只出现在一个 Set 中,我需要能够打印诸如“Luke 是单语”之类的内容。
  • 您不应在问题正文中添加解决方案作为以后的编辑。相反,将其添加为真正的解决方案并将其标记为答案。但是,您的解决方案不正确,因为它错过了您的示例中的 Tara。那是因为你忽略了不会说英语的人,只取英语集的差异。
  • 公平喊叫。新一轮在这里 - 只是认为靠近顶部的解决方案可以为未来的游客节省拖网!练习表明我们应该假设每个人都会说英语,因此我的策略是将所有内容与第一行输入进行比较。一定是示例程序文本中的错误。干杯。

标签: python dictionary set


【解决方案1】:

我会颠倒字典中键和值的顺序,因为它使问题变得更容易。因此,与其按语言存储使用该语言的不同用户,不如为每个用户创建该人使用的所有语言的个人资料:

from collections import defaultdict

user_langs = defaultdict(list)

while True:
    info = map(lambda s: s.strip(), raw_input('Line: ').split())
    if info:
        for user in info[1:]:
            user_langs[user].append(info[0])
    else:
        break

for user in user_langs:
    if len(user_langs[user]) < 2:
        print("{} is monolingual.".format(user))

【讨论】:

  • 颠覆它的好方法!感谢您的支持!
【解决方案2】:

languages[toungue]已经是一个集合,你不需要set(languages[touge])。 此外,您不需要循环字典,您可以简单地从字典中通过lanuages.values() 获取那些集合。

虽然不完全确定你想在这里实现什么。大胆猜测,您可能想要语言值中的唯一值?

您可以通过将值更新为新集合来实现此目的:

改变这个:

for tongue in languages:
  print(set(languages[tongue]))

到这里:

new_set = set()
for v in languages.values():
    new_set.update(v)

new_set # dummy lanugages
{'English', 'Japanese', 'whatever', 'yeah'}

更新

要实现你想要的,你可以使用 Counter 并在 value == 1 时返回键。

更详细的解释是,在for/loop 下,您要将一组与另一组进行比较。但是你真正需要的是比较所有的集合,所以我选择使用c 来更新for/loop 下的所有单独的集合值,然后从c 中做任何你想做的事情。如果有人只有一种语言,我在这里使用Counter 作为你想要计算的值。

from collections import Counter
c = Counter()

for v in languages.values():
    c.update(v)

for k,v in c.iteritems():
    if v == 1:
        print k, " is monolingual"

Ben  is monolingual
James  is monolingual
Tara  is monolingual

c 看起来像这样:

c
Counter({'Tim': 3, 'Nicky': 2, 'John': 2, 'Ben': 1, 'James': 1, 'Tara': 1})

【讨论】:

  • 我只需要能够查看字典中的集合之间的差异。因此,例如,如果基于用户输入的内容,我最终在字典中得到了三个集合,告诉我哪些人说三种不同的语言,我需要能够比较这些集合以查看某人是否是单语的,即他们的名字只出现在字典中的一组。希望这是有道理的!
  • @Mathmos,这对我来说没有意义,您已经从字典本身获得了一组信息。你到底想比较什么?您可以更新 OP 以显示您的预期输出示例吗?
  • 已更新。顺便说一句,感谢您的帮助和耐心!
  • @Mathmos,我已经更新了我的答案以实现你想要的:)
  • 非常感谢您的帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 2010-09-30
  • 2021-08-25
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多