2017-08-01 17 views
2

辞書にもリストが含まれている辞書のリストがあります。リストの辞書から一意の値のセットを取得

それぞれのネストされたリストの値のうち、setを生成して、すべてのユニークなアイテム(この場合は趣味)のセットになります。

私はsetが自動的にすべての重複を削除するので、これは完璧だと感じ、すべてのユニークな趣味のセットで私を残す。

people = [{'name': 'John', 'age': 47, 'hobbies': ['Python', 'cooking', 'reading']}, 
      {'name': 'Mary', 'age': 16, 'hobbies': ['horses', 'cooking', 'art']}, 
      {'name': 'Bob', 'age': 14, 'hobbies': ['Python', 'piano', 'cooking']}, 
      {'name': 'Sally', 'age': 11, 'hobbies': ['biking', 'cooking']}, 
      {'name': 'Mark', 'age': 54, 'hobbies': ['hiking', 'camping', 'Python', 'chess']}, 
      {'name': 'Alisa', 'age': 52, 'hobbies': ['camping', 'reading']}, 
      {'name': 'Megan', 'age': 21, 'hobbies': ['lizards', 'reading']}, 
      {'name': 'Amanda', 'age': 19, 'hobbies': ['turtles']}, 
      ] 

unique_hobbies = (item for item in people['hobbies'] for hobby in people['hobbies'].items()) 

print(unique_hobbies) 

これは、エラーが発生します。

TypeError: list indices must be integers or slices, not str 

私の理解が間違っているが、私はどこかわかりません。私は各辞書を繰り返し、各入れ子にされたリストを繰り返し、アイテムをセットに更新してすべての重複を削除し、すべてのユニークな趣味のセットを残したいと思います。

答えて

1

ます。また、セットの理解使用することができますあなたの理解に問題があなたがpeople['hobbies']にアクセスしたいということですが、peopleがリストと缶です

>>> unique_hobbies = {hobby for persondct in people for hobby in persondct['hobbies']} 
>>> unique_hobbies 
{'horses', 'lizards', 'cooking', 'art', 'biking', 'camping', 'reading', 'piano', 'hiking', 'turtles', 'Python', 'chess'} 

を整数またはスライスのインデックスリストのみ。それを動作させるには、リストを反復して、各サブディクテーションの'hobbies'にアクセスする必要があります(上記の説明の中で行ったように)。

+0

これは私の質問にお答えしますが、もしあれば私はフォローアップを持っています。それは動作しますが、PyCharmはあなたの理解が働いてから私が得られない警告を投げています。警告は: 'collections.iterable'が必要ですが、代わりにUnion [str、int、List [str]]があります。 – MarkS

+0

'' hobbies''がすべてList [str] 'であるため、その意味がわかりません。たぶんPyCharmは他の辞書エントリ(名前は 'str'、年代は' int')と混同しているかもしれません。 – MSeifert

1

私はそれを得た:

unique_hobbies = set() 

for d in people: 
    unique_hobbies.update(d['hobbies']) 

print(unique_hobbies) 
関連する問題