Python 基于条件筛选嵌套词典
所以我有下面的字典Python 基于条件筛选嵌套词典,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,所以我有下面的字典 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, 'Schauspi
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编程的初学者,任何帮助都将不胜感激。您只需循环查看
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}}
它确实不完全相同,但非常相似。。不管怎样,您确实在代码方面付出了一些努力。请看下面的代码。出于美观的原因,我已将您的循环转换为
列表理解
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))
代码的问题是schaupilern
,当它实际上应该用作字典时,它被用作变量名
试运行:
在::
输出::
试试这个:你可以在这里测试
您可以尝试以下方法:
Spielern = []
for x in range(3):
Spieler = input("Schauspieler: ")
Spielern.append(Spieler)
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"]}
}
final_movies = {a:b for a, b in Filme.items() if any(i in b['Schauspielern'] for i in Spielern)}
这里有几个问题可以帮助您实现您的目标:
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))))
这是你今天第二次问这个问题了,对吗?这个代码不是在Schaupilern上出现了NameError
?@Ev.Kounis这不是一回事,我不会问我是否知道如何解决这个问题it@PM2Ring它说,如果Schaupilern中的元素在此代码中不起作用,则未定义,您需要迭代Filme
,然后检查字典键Schaupilern
。上面的代码是非工作代码。请发布带有特定错误的运行代码或非运行代码,以及到目前为止您到底尝试了什么。@Adirio我最初没有更改代码的这一部分。我是否可以建议:print(“{}:{}”。format(subK,subV))
?
Spielern = []
for x in range(3):
Spieler = input("Schauspieler: ")
Spielern.append(Spieler)
new_dict = list({})
for film in Filme:
print(film)
for schauspieler in Spielern:
if schauspieler in Filme[film]["Schauspielern"]:
if Filme[film] not in new_dict:
new_dict.append(Filme[film])
print(new_dict)
Spielern = []
for x in range(3):
Spieler = input("Schauspieler: ")
Spielern.append(Spieler)
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"]}
}
final_movies = {a:b for a, b in Filme.items() if any(i in b['Schauspielern'] for i in Spielern)}
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]