我是 python 的新手,我正在尝试使用一个字典,其中包含类似于以下布局的键:
dict = {
'Tim': ['red', 'pizza', 'soda'],
'Jake': ['green', 'burger', 'juice'],
'Mary': ['blue', 'salad', 'water']
}
我将如何让用户输入姓名,然后将该人的信息内容设置为代码中的变量值? 例如,如果用户选择查看有关 Jake 的信息,则:
favoriteColor = green
favoriteFood = burger
favoriteDrink = juice
我真的只是不知道如何在 python 中调用这个特定类型字典中的特定值。会不会是类似这样的东西:
favoriteColor = dict.Jake[0]
favoriteFood = dict.Jake[1]
favoriteDrink = dict.Jake[2]
您可以像这样访问字典中的每个条目:
dict["Jake"]
这将返回列表
['green', 'burger', 'juice']
然后您可以像这样从该列表中获取您需要的任何元素(例如他们最喜欢的颜色):
dict["Jake"][0]
会返回
'green'
你可以通过首先使用 .get() 方法来实现这一点,然后通过它们的特定变量过滤掉它们。
例如,您可以使用以下片段作为如何执行此操作的概述:
# Initial dictionary
dict = {
'Tim': ['red', 'pizza', 'soda'],
'Jake': ['green', 'burger', 'juice'],
'Mary': ['blue', 'salad', 'water']
}
# Check input for name
name = input("Enter a name:")
# Returns values for inputted name in dictionary
name_values_in_dict = dict.get(name)
# If it is none, return that it could not be found.
if name_values_in_dict is None:
print("Name could not be found in dictionary.")
# If it is found, store in variables and print them out.
favoriteColor = name_values_in_dict[0]
favoriteFood = name_values_in_dict[1]
favoriteDrink = name_values_in_dict[2]
print(f'Favorite color is: {favoriteColor}, favorite food is: {favoriteFood}, and favorite drink is: {favoriteDrink}')
使用一个列表,其中每个元素都隐含地对应于某种类型(在本例中是颜色、食物、饮料)很少是一个好主意。使用类要好得多。然后,通过明智的变量命名,很明显每个值的含义。像这样的东西:
class Favourites:
def __init__(self, food, colour, drink):
self._food = food
self._colour = colour
self._drink = drink
def __repr__(self):
return f'{self._food=} {self._colour=} {self._drink=}'
database = dict()
while (name := input('Name: ')):
food = input('Food: ')
colour = input('Colour: ')
drink = input('Drink: ')
database[name] = Favourites(food, colour, drink)
print(database)
现在我们可以为多人输入“收藏夹”了。只需按回车键(空输入)即可打破循环并查看构建的内容
好吧,既然你是新来的,我会试着解释一下。
首先,尽量不要使用保留字作为变量名
是类型dict
的python保留字。dictionary
关于用户输入,我建议您阅读:Python 中的基本输入、输出和字符串格式
Python 字典是键值对的集合,这意味着您有多个项目,每个项目都有一个“索引”或“名称”(键)和一个值(任何东西,在您的情况下,列表)
所以当你有:
MyDict = {
'Tim': ['red', 'pizza', 'soda'],
'Jake': ['green', 'burger', 'juice'],
'Mary': ['blue', 'salad', 'water']
}
这意味着您有 3 个键,Tim、Jake 和 Mary,因此如果您使用键
Tim
,您将访问该项目的值,即列表:['red', 'pizza', 'soda']
并获取该列表的第一个元素你可以:
tim_favorite_color = MyDict['Tim'][0]
# Which is the same as:
tim_favorites = MyDict['Tim']
tim_favorite_color = tim_favourites[0] # red
为了使您的代码更具可读性,您可以为收藏夹列表使用另一种数据结构,我建议使用 namedtuple。
from collections import namedtuple
FavoriteValues = namedtuple("FavoriteValues", ["color", "food", "drink"])
Favorites = {
'Tim': FavoritesValues('red', 'pizza', 'soda')
}
# This allows you write code like:
Favorites['Tim'].food # pizza
我会为你准备一些东西,你必须搜索关于 类和 lambda ;)
所以,你想用来使你的代码更好的另一件事是使用 DefaultDict 和类。
from collections import defaultdict
class TFavorite:
def __init__(self, color, food, drink):
self.color = color
self.food = food
self.drink = drink
Favorites = defaultdict(lambda: TFavorite('unknown', 'unknown', 'unknown'))
# prints 'unknown' first time we lookup for Tim
# so no previous info.
print(Favorites['Tim'].color)
Favorites['Tim'].color = 'red'
print(Favorites['Tim'].color) # prints 'red'
print(Favorites['Tim'].food) # still unknown
正如其他人已经提到的,将变量命名为
dict
并不是最好的主意,因为它已经在 python 中意味着某些东西,所以我将在我的其余答案中将其重新定义为 favsDict
作为上下文。
favsDict = { 'Tim': ['red', 'pizza', 'soda'],
'Jake': ['green', 'burger', 'juice'],
'Mary': ['blue', 'salad', 'water'] }
我真的不知道如何在python中调用这个特定类型字典中的特定值
您可能想看看有关 dictionaries 的文档以及如何使用键访问值 [以及 lists,其值可以使用索引访问],但下面是一些使用
favsDict
的示例:
favsDict['Jake']
应该回来['red', 'pizza', 'soda']
favsDict['Tim'][0]
应该回来'red'
favsDict['Mary'][2]
应该回来'water'
tim_ffood = favsDict['Tim'][1]
实际上应该与tim_ffood = 'pizza'
我将如何让用户输入姓名,然后将该人的信息内容设置为代码中的变量值?
input
函数来提示和获取用户输入,并且有多种设置变量的方法。 (下面示例的。)
search_name = input('Please enter a name: ')
if search_name in favsDict:
favsList = favsDict[search_name]
# favoriteColor, favoriteFood, favoriteDrink = favsDict[search_name] # = favsList ## OR
# favoriteColor,favoriteFood,favoriteDrink = favsList[0],favsList[1],favsList[2] ## OR
favoriteColor = favsList[0] # favsDict[search_name][0]
favoriteFood = favsList[1] # favsDict[search_name][1]
favoriteDrink = favsList[2] # favsDict[search_name][2]
for fCat, fVal in zip(['color','food','drink'], favsList):
print(f"\t{search_name}'s favourite {fCat} is {fVal}")
else: print(f'! Could not find any records for {repr(search_name)} !')
如果你想从用户输入
()构建
favsDict
并且你有一定数量的人要添加:
personsCt = 3 # how many names/people
fav_categories = ['Color', 'Food', 'Drink'] # list template for asking
favsDict = {input(f'\n[Person#{i+1}] Please Enter\n\tName: '): [
input(f'\tFavorite {f}: ') for f in fav_categories
] for i in range(personsCt)}
print()
favsDict
如果想让用户决定什么时候停止,可以使用
while
循环()
fav_categories = ['color', 'food', 'drink'] # list template for asking
favsDict = {} # initiate
while (pName := input(f'\n[Just press Enter to exit]\nEnter name: ')):
fPromptr = lambda fc: input(f"\t{pName}'s favorite {fc} is: ")
favsDict[pName] = [fPromptr(fCat) for fCat in fav_categories]
print()
favsDict
顺便说一句,walrus operator
:=
仅适用于 python 3.8 或更高版本;没有它,你需要pName=input(...)
在while pName:...
之前和结尾。
请注意,如果重复任何名称,则只会保留该名称的最新输入数据。