2013-06-20 35 views
15

Tôi đang gặp khó khăn với một vấn đề nhỏ trong Python (chương trình của tôi hiện đang có trong phiên bản 3.2.3).In tất cả các giá trị duy nhất trong từ điển Python

Tôi có một cuốn từ điển đó trông như thế này (đây chỉ là một ví dụ, trên thực tế được lấy từ bài khác ở đây):

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

Tôi muốn chỉ đơn giản là in() một danh sách các giá trị duy nhất, loại bỏ các bản sao. Ở cuối danh sách này, tôi muốn in số lượng giá trị duy nhất trong từ điển:

movies 
sports 
music 
news 

4 

Bất kỳ trợ giúp nào được đánh giá cao. Có một số bài viết khác ở đây tôi thấy rằng có phần liên quan, nhưng tôi không biết Python cũng đủ để áp dụng nó cho vấn đề cụ thể này.

+6

bạn có * danh sách * từ điển. – jfs

Trả lời

9

Sử dụng một 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)) 

Sử dụng .itervalues() trên Python 2 cho một hiệu quả ít hơn. Vì bạn có danh sách từ điển, trước tiên chúng tôi cần phải rút ra các giá trị từ mỗi từ điển đó; Tôi đã từng itertools.chain.from_iterable() với một biểu thức máy phát điện để liệt kê tất cả các giá trị trong một chuỗi:

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

Cách khác là sử dụng các vòng lặp lồng nhau trong biểu thức máy phát điện:

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

Sử dụng set đây vì chúng chỉ chứa các mặt hàng độc đáo .

>>> 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']) 

Vòng qua bộ này để có được những kết quả mong muốn:

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

này dòng s = set(val for dic in lis for val in dic.values()) là tương đương với:

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

Điểm để giải thích khả năng hiểu danh sách lồng nhau. – DuffJ

+0

Danh sách lồng nhau đó là điên rồ, sẽ có ** không bao giờ nghĩ đến điều đó. – ToothlessRebel

4
dict = {'511':'Vishnu','512':'Vishnu','513':'Ram','514':'Ram','515':'sita'} list =[] 
for val in dict.values(): 
    if val in list: 
    continue 
    else: 
    list.append(val) 

print list 
+0

Vui lòng định dạng câu trả lời của bạn dưới dạng mã. – tfv

6

Bạn có thể explot các thuộc tính của set cho Mục đích này; mỗi phần tử là duy nhất và các bản sao sẽ bị bỏ qua.

uniqueValues = set(myDict.values()) 

Bằng cách sử dụng set theo cách này, lặp lại các yếu tố trở về từ .values() sẽ bị loại bỏ. Sau đó, bạn có thể in chúng như sau:

for value in uniqueValues: 
    print(value) 
print(len(uniqueValues)) 
Các vấn đề liên quan