基于标准过滤嵌套词典

2024-09-26 22:55:19 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有下面的字典。你知道吗

Filme = {'1': {'Titel': 'Titanic', 'Jahr': 1997, 'Wertung': 8, 'Preis': 30, 'Schauspielern': ["Leonardo Dicaprio", "Kate Winslet", "Gloria Stuart"]},
         '2': {'Titel': 'Pulp Fiction', 'Jahr': 1994, 'Wertung': 9, 'Preis': 40, 'Schauspielern': ["Uma Thurman","John Travolta","Quentin Tarantion"]},
         '3': {'Titel': 'Wings of Desire', 'Jahr': 1987, 'Wertung': 8, 'Preis': 40, 'Schauspielern': ["Bruno Ganz","Peter Falk","Otto Sander"]},
         '4': {'Titel': 'London Has Fallen', 'Jahr': 2016, 'Wertung': 6, 'Preis': 20, 'Schauspielern': ["Gerald Butler","Morgan Freeman","Aaron Eckhart"]},
         '5': {'Titel': 'Avatar', 'Jahr': 2009, 'Wertung': 8, 'Preis': 35, 'Schauspielern': ["Zoe Saldana","Sigourney Weaver","Sam Worthington"]},
         '6': {'Titel': 'The Devil Wears Prada', 'Jahr': 2006, 'Wertung': 7, 'Preis': 20, 'Schauspielern': ["Meryl Streep","Anne Hathaway","Simon Baker"]},
         '7': {'Titel': 'Submarine', 'Jahr': 2010, 'Wertung': 7, 'Preis': 20, 'Schauspielern': ["Craig Roberts","Yasmin Paige","Sally Hawkins"]},
         '8': {'Titel': 'About Time', 'Jahr': 2013, 'Wertung': 8, 'Preis': 37, 'Schauspielern': ["Margot Robbie","Rachel McAdams","Domhnall Gleeson"]},
         '9': {'Titel': 'Love, Rosie', 'Jahr': 2014, 'Wertung': 7, 'Preis': 25, 'Schauspielern': ["Lily Collins","Sam Claflin","Christian Cooke"]},
        '10': {'Titel': 'Me Before You', 'Jahr': 2016, 'Wertung': 9, 'Preis': 45, 'Schauspielern': ["Emilia Clarke","Sam Claflin","Matthew Lewis"]}
    }`

我必须对它进行排序,以便它只显示包含特定演员的电影。我尝试创建一个包含3个参与者(由用户介绍)的列表,以便与其他列表进行比较。如果找到了一个普通的演员,电影(包括所有的特殊信息)将被存储在另一本字典中并最终打印出来。你知道吗

以下是我尝试实现的代码:

Spielern = []

for x in range(3):
    Spieler = input("Schauspieler: ")
    Spielern.append(Spieler)

print(Spielern)

new_dict = {}
for element in Spielern:
    if element in Schauspielern:
        new_dict.update(Filme[element])

for x in new_dict:
    print(x)
    for y in new_dict[x]:
        print(y, ':', new_dict[x][y])

print(new_dict)

但它不起作用,我也不知道为什么。考虑到我是Python编程的初学者,任何帮助都将不胜感激。你知道吗


Tags: innewfor字典samelementdictprint
3条回答

以下是一些帮助您实现所需的查询:

import itertools

Filme = {
    '1': {'Titel': 'Titanic', 'Jahr': 1997, 'Wertung': 8, 'Preis': 30, 'Schauspielern': ["Leonardo Dicaprio", "Kate Winslet", "Gloria Stuart"]},
    '2': {'Titel': 'Pulp Fiction', 'Jahr': 1994, 'Wertung': 9, 'Preis': 40, 'Schauspielern': ["Uma Thurman", "John Travolta", "Quentin Tarantion"]},
    '3': {'Titel': 'Wings of Desire', 'Jahr': 1987, 'Wertung': 8, 'Preis': 40, 'Schauspielern': ["Bruno Ganz", "Peter Falk", "Otto Sander"]},
    '4': {'Titel': 'London Has Fallen', 'Jahr': 2016, 'Wertung': 6, 'Preis': 20, 'Schauspielern': ["Gerald Butler", "Morgan Freeman", "Aaron Eckhart"]},
    '5': {'Titel': 'Avatar', 'Jahr': 2009, 'Wertung': 8, 'Preis': 35, 'Schauspielern': ["Zoe Saldana", "Sigourney Weaver", "Sam Worthington"]},
    '6': {'Titel': 'The Devil Wears Prada', 'Jahr': 2006, 'Wertung': 7, 'Preis': 20, 'Schauspielern': ["Meryl Streep", "Anne Hathaway", "Simon Baker"]},
    '7': {'Titel': 'Submarine', 'Jahr': 2010, 'Wertung': 7, 'Preis': 20, 'Schauspielern': ["Craig Roberts", "Yasmin Paige", "Sally Hawkins"]},
    '8': {'Titel': 'About Time', 'Jahr': 2013, 'Wertung': 8, 'Preis': 37, 'Schauspielern': ["Margot Robbie", "Rachel McAdams", "Domhnall Gleeson"]},
    '9': {'Titel': 'Love, Rosie', 'Jahr': 2014, 'Wertung': 7, 'Preis': 25, 'Schauspielern': ["Lily Collins", "Sam Claflin", "Christian Cooke"]},
    '10': {'Titel': 'Me Before You', 'Jahr': 2016, 'Wertung': 9, 'Preis': 45, 'Schauspielern': ["Emilia Clarke", "Sam Claflin", "Matthew Lewis"]}
}


def flatten_list(lst):
    return list(
        itertools.chain(*[([v] if isinstance(v, str) else v) for v in lst]))


def get_movies_by_actor(data, actor):
    return [row['Titel'] for key, row in data.items() if actor in row['Schauspielern']]


def get_actors(data):
    return set(flatten_list([row['Schauspielern'] for key, row in data.items()]))

for actor in sorted(get_actors(Filme)):
    print('actor={: <20} films=[{}]'.format(
        actor, ",".join(get_movies_by_actor(Filme, actor))))

输出:

actor=Aaron Eckhart        films=[London Has Fallen]
actor=Anne Hathaway        films=[The Devil Wears Prada]
actor=Bruno Ganz           films=[Wings of Desire]
actor=Christian Cooke      films=[Love, Rosie]
actor=Craig Roberts        films=[Submarine]
actor=Domhnall Gleeson     films=[About Time]
actor=Emilia Clarke        films=[Me Before You]
actor=Gerald Butler        films=[London Has Fallen]
actor=Gloria Stuart        films=[Titanic]
actor=John Travolta        films=[Pulp Fiction]
actor=Kate Winslet         films=[Titanic]
actor=Leonardo Dicaprio    films=[Titanic]
actor=Lily Collins         films=[Love, Rosie]
actor=Margot Robbie        films=[About Time]
actor=Matthew Lewis        films=[Me Before You]
actor=Meryl Streep         films=[The Devil Wears Prada]
actor=Morgan Freeman       films=[London Has Fallen]
actor=Otto Sander          films=[Wings of Desire]
actor=Peter Falk           films=[Wings of Desire]
actor=Quentin Tarantion    films=[Pulp Fiction]
actor=Rachel McAdams       films=[About Time]
actor=Sally Hawkins        films=[Submarine]
actor=Sam Claflin          films=[Love, Rosie,Me Before You]
actor=Sam Worthington      films=[Avatar]
actor=Sigourney Weaver     films=[Avatar]
actor=Simon Baker          films=[The Devil Wears Prada]
actor=Uma Thurman          films=[Pulp Fiction]
actor=Yasmin Paige         films=[Submarine]
actor=Zoe Saldana          films=[Avatar]

您只需循环浏览Filme字典,检查每部电影中的演员列表是否与您要搜索的演员集相交。你知道吗

from pprint import pprint

Filme = {
'1': {'Jahr': 1997,
       'Preis': 30,
       'Schauspielern': ['Leonardo Dicaprio', 'Kate Winslet', 'Gloria Stuart'],
       'Titel': 'Titanic',
       'Wertung': 8},
 '10': {'Jahr': 2016,
        'Preis': 45,
        'Schauspielern': ['Emilia Clarke', 'Sam Claflin', 'Matthew Lewis'],
        'Titel': 'Me Before You',
        'Wertung': 9},
 '2': {'Jahr': 1994,
       'Preis': 40,
       'Schauspielern': ['Uma Thurman', 'John Travolta', 'Quentin Tarantion'],
       'Titel': 'Pulp Fiction',
       'Wertung': 9},
 '3': {'Jahr': 1987,
       'Preis': 40,
       'Schauspielern': ['Bruno Ganz', 'Peter Falk', 'Otto Sander'],
       'Titel': 'Wings of Desire',
       'Wertung': 8},
 '4': {'Jahr': 2016,
       'Preis': 20,
       'Schauspielern': ['Gerald Butler', 'Morgan Freeman', 'Aaron Eckhart'],
       'Titel': 'London Has Fallen',
       'Wertung': 6},
 '5': {'Jahr': 2009,
       'Preis': 35,
       'Schauspielern': ['Zoe Saldana', 'Sigourney Weaver', 'Sam Worthington'],
       'Titel': 'Avatar',
       'Wertung': 8},
 '6': {'Jahr': 2006,
       'Preis': 20,
       'Schauspielern': ['Meryl Streep', 'Anne Hathaway', 'Simon Baker'],
       'Titel': 'The Devil Wears Prada',
       'Wertung': 7},
 '7': {'Jahr': 2010,
       'Preis': 20,
       'Schauspielern': ['Craig Roberts', 'Yasmin Paige', 'Sally Hawkins'],
       'Titel': 'Submarine',
       'Wertung': 7},
 '8': {'Jahr': 2013,
       'Preis': 37,
       'Schauspielern': ['Margot Robbie', 'Rachel McAdams', 'Domhnall Gleeson'],
       'Titel': 'About Time',
       'Wertung': 8},
 '9': {'Jahr': 2014,
       'Preis': 25,
       'Schauspielern': ['Lily Collins', 'Sam Claflin', 'Christian Cooke'],
       'Titel': 'Love, Rosie',
       'Wertung': 7}
}

Spielern = {'Leonardo Dicaprio', 'Uma Thurman', 'Meryl Streep'}

new_filme = {k:v for k,v in Filme.items() if Spielern.intersection(v['Schauspielern'])}
pprint(new_filme)

输出

{'1': {'Jahr': 1997,
       'Preis': 30,
       'Schauspielern': ['Leonardo Dicaprio', 'Kate Winslet', 'Gloria Stuart'],
       'Titel': 'Titanic',
       'Wertung': 8},
 '2': {'Jahr': 1994,
       'Preis': 40,
       'Schauspielern': ['Uma Thurman', 'John Travolta', 'Quentin Tarantion'],
       'Titel': 'Pulp Fiction',
       'Wertung': 9},
 '6': {'Jahr': 2006,
       'Preis': 20,
       'Schauspielern': ['Meryl Streep', 'Anne Hathaway', 'Simon Baker'],
       'Titel': 'The Devil Wears Prada',
       'Wertung': 7}}

它确实不完全相同,但非常相似。。不管怎样,你确实在代码方面做了一些努力。请看下面的代码。出于美观的考虑,我将您的循环转换为list-comprehensions。你知道吗

Spielern = [input("Schauspieler: ") for _ in range(3)]
print(Spielern)

new_dict = {k: v for k, v in Filme.items() if any(x in v['Schauspielern'] for x in Spielern)}
print(new_dict)

for k, v in new_dict.items():
    print(k)
    for subK, subV in v.items():
        print(" {}: {}".format(subK, subV))

您的代码的问题是Schauspielern,当它实际上应该用作dictionarykey时,它被用作变量名。你知道吗

试运行:

在::

Schauspieler:  Leonardo Dicaprio
Schauspieler:  Peter Falk
Schauspieler:  Bruno Ganz

退出:

1
  Titel: Titanic
  Jahr: 1997
  Wertung: 8
  Preis: 30
  Schauspielern: ['Leonardo Dicaprio', 'Kate Winslet', 'Gloria Stuart']
3
  Titel: Wings of Desire
  Jahr: 1987
  Wertung: 8
  Preis: 40
  Schauspielern: ['Bruno Ganz', 'Peter Falk', 'Otto Sander']

相关问题 更多 >

    热门问题