【问题标题】:Print all Unique Values in a Python Dictionary打印 Python 字典中的所有唯一值
【发布时间】:2013-06-17 13:48:37
【问题描述】:

我正在努力解决 Python 中的一个小问题(我的程序现在是 3.2.3 版)。

我有一个看起来像这样的字典(这只是一个例子,实际上取自这里的另一篇文章):

[
    {"abc": "movies"},
    {"abc": "sports"},
    {"abc": "music"},
    {"xyz": "music"},
    {"pqr": "music"},
    {"pqr": "movies"},
    {"pqr": "sports"},
    {"pqr": "news"},
    {"pqr": "sports"},
]

我想简单地 print() 一个唯一值列表,消除重复。在此列表的末尾,我想打印字典中唯一值的数量:

movies
sports
music
news

4

感谢任何帮助。我发现这里还有一些其他帖子有些相关,但我对 Python 的了解还不够,无法将其应用于这个特定问题。

【问题讨论】:

  • 你有一个列表的字典。

标签: python dictionary


【解决方案1】:

您可以为此目的利用set 的属性;每个元素都是唯一的,重复的将被忽略。

uniqueValues = set(myDict.values())

通过这种方式使用set,从.values()返回的重复元素将被丢弃。然后您可以按如下方式打印它们:

for value in uniqueValues:  
    print(value)  
print(len(uniqueValues))

【讨论】:

  • 如果 myDict 的值也是字典,这不起作用
【解决方案2】:
dict = {'511':'Vishnu','512':'Vishnu','513':'Ram','514':'Ram','515':'sita'}
list =[] # create empty list
for val in dict.values(): 
  if val in list: 
    continue 
  else:
    list.append(val)

print list

【讨论】:

  • A set 会更有效。使用 in 运算符对列表来说效率不高。
【解决方案3】:

在这里使用set,因为它们只包含独特的项目。

>>> lis = [{"abc":"movies"}, {"abc": "sports"}, {"abc": "music"}, {"xyz": "music"}, {"pqr":"music"}, {"pqr":"movies"},{"pqr":"sports"}, {"pqr":"news"}, {"pqr":"sports"}]
>>> s = set( val for dic in lis for val in dic.values())
>>> s 
set(['movies', 'news', 'music', 'sports'])

循环这个集合以获得预期的输出:

for x in s:                                
    print x
print len(s)   #print the length of set after the for-loop
... 
movies
news
music
sports
4

s = set( val for dic in lis for val in dic.values()) 这一行大致相当于:

s = set()
for dic in lis:
   for val in dic.values():
      s.add(val)

【讨论】:

  • 解释嵌套列表理解的要点。
  • 那个嵌套列表太疯狂了,从来没有想到过。
【解决方案4】:

使用set()

from itertools import chain

unique_values = set(chain.from_iterable(d.values() for d in dictionaries_list))
for value in unique_values:
    print(value)

print(len(unique_values))

在 Python 2 上使用 .itervalues() 以提高效率。因为您有一个 list 字典,所以我们需要首先从每个字典中提取值;我使用itertools.chain.from_iterable() 和生成器表达式来按顺序列出所有值:

>>> for value in set(chain.from_iterable(d.values() for d in dictionaries_list)):
...     print(value)
... 
news
sports
movies
music

另一种方法是在生成器表达式中使用嵌套循环:

>>> for value in set(v for d in dictionaries_list for v in d.values()):
...     print(value)
... 
news
sports
movies
music

【讨论】:

    猜你喜欢
    • 2018-05-16
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多