从字典中获取键名

Getting a name of a key from a dictionary

我目前正在学习 python,我正在努力解决一个问题,我需要从用户输入一个名称并获取名称的第一个字母,并根据字母告诉他需要一周中的哪一天去(上下文无关紧要),所以: 周一:A - C;周二:D - G;星期三:H-L;星期四:男;周五:N-Q;周六:R - S;周日:T - Z.

tuple_letter = (['a', 'b', 'c'], ['d', 'e', 'f', 'g'], ['h', 'i', 'j', 'k', 'l'], ['m'], ['n', 'o', 'p', 'q'], ['r', 's', 't'], ['u', 'v', 'w', 'x', 'y', 'z'])
tuple_week = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] 

name = input("Name: \n")
for letters in tuple_letter:
    if letters.count(name[0]) >= 1:
         print(name + ", you should go to the hospital on " + tuple_week[letters])

我认为就像在 c# 中一样,例如 for 中的“字母”,它实际上就像 i++ 一样,它算作一个数字,但实际上,python 本身知道什么时候我们说“对于 tuple_letter 中的字母”我实际上指的是列表“tuple_letter”中的列表,所以它不起作用,因为我的逻辑基于我会使用的事实它指的是每个列表的元素,因为我把每个列表的每个元素都按相同的顺序排列(星期一和 'a'、'b'、'c' == 1,.... )

为了总结和连接标题,我想到了一个想法,我会创建一个字典,其中每个键都是字母列表的一周中的相应日期,就像我尝试过的那样。 那么,我该怎么做呢?是否可以?更好的方法?

可以,这可能更符合逻辑。在 Python 中使用字典很容易,因为它们遵循 JSON 的标准。必读在这里:https://www.w3schools.com/python/python_dictionaries.asp

您的示例将涉及像这样的字典:

example_dict = {
    "Monday": ['a', 'b', 'c'],
    "Tuesday": ['d', 'e', 'f', 'g'],
    "Wednesday": ['h', 'i', 'j', 'k', 'l'],
    "Thursday": ['m'],
    "Friday": ['n', 'o', 'p', 'q'],
    "Saturday": ['r', 's', 't'],
    "Sunday": ['u', 'v', 'w', 'x', 'y', 'z']
}

从那里您可以使用 for 循环进行迭代,然后使用 example_dict[x] 之类的内容进行索引查找。这是重构代码的第二部分以显示这一点:

name = input("Name: \n")

if len(name) > 0:
    for i in example_dict:
        # Lower case the letter for comparison
        if name[0].lower() in example_dict[i]:
            print(name + ", you should go to the hospital on " + i)

您可以将列表存储在字典中!因此,一旦您迭代了这些值,只需检查哪一天包含您正在分析的姓名的字母即可。

希望这能帮助您入门。

tuple_letter = (['a', 'b', 'c'], ['d', 'e', 'f', 'g'], ['h', 'i', 'j', 'k', 'l'], ['m'], ['n', 'o', 'p', 'q'], ['r', 's', 't'], ['u', 'v', 'w', 'x', 'y', 'z'])
tuple_week = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] 
dictionary = dict(zip(tuple_week, tuple_letter))
print(dictionary)
name = input("Name: \n")
for key, value in dictionary.items():
  if name.lower()[0] in value:
    print(name.capitalize() , ", you should go to the hospital on " , key)
  1. 使用内置函数制作字典,同时更加关注键值对
  2. 您可以输入大写或小写,因为在比较过程中它先变成小写再比较

字典的工作原理是让键与值相对应,因此如果您执行 dict[key]dict.get(key),您将获得值。

问题是,对于您的方案,它会产生一些重复编码。

letter_to_day = {
    'a':"Monday",
    'b':"Monday",
    'c':"Monday",
    'd':"Tuesday",
    ... # fair amount of typing
    'z':"Sunday"
}
name = input("Name: \n")

print(name + ", you should go to the hospital on " + letter_to_day[name[0].lower()])
#raises an error if it isn't a letter

print(name + ", you should go to the hospital on " + letter_to_day.get(name[0].lower(), "not a letter"))
#this one will return "not a letter" if it isn't found

您可以采取一些变通办法,例如

letter_to_day = {}
for day in tuple_week:
    for letters in tuple_letter:
        for letter in letters:
            letter_to_day[letter] = day

而不是全部输入,甚至不用 print(letter_to_day) 和 copy-and-pasting 结果。

但事实证明还有另一种方法 - 您可以对字符串使用不等式(以及列表,但这并不重要)。

按字母顺序排列靠后的字符串较大,而靠前的字符串较小。 "a" < "b"True

所以这意味着你可以做类似

的事情
def letter_to_day(letter):
    if "a" <= letter <= "c":
        return "Monday"
    elif "d" <= letter <= "g":
        return "Tuesday"
    elif "h" <= letter <= "l":
        return "Wednesday"
    elif letter == "m":
        return "Thursday"
    elif "n" <= letter <= "q":
        return "Friday"
    elif "r" <= letter <= "s":
        return "Saturday"
    elif "t" <= letter <= "z":
        return "Sunday"
    else:
        return "not a letter"

name = input("Name: \n")
print(name + ", you should go to the hospital on " + letter_to_day(name[0].lower()))

iamwbj 在这个 post 上的回答回答了你关于拥有一个以天为键、以字母列表为值的字典的问题。我认为我的速度更快,尽管它没有按照您预期的方向发展。

P.S。我不确定你是不是真的指星期六 R-S;周日:T-Z - 您的示例代码和问题有冲突。

你遗漏了两点:

  • 列表索引必须是整数
    • 添加初始参数如i表示索引
    • 在检查
    • 时使用break退出for循环
  • 名称应改为小写
    • 添加lower()转换name[0]
tuple_letter = (['a', 'b', 'c'], ['d', 'e', 'f', 'g'], ['h', 'i', 'j', 'k', 'l'], ['m'], ['n', 'o', 'p', 'q'], ['r', 's', 't'], ['u', 'v', 'w', 'x', 'y', 'z'])
tuple_week = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] 

name = input("Name: \n")
i = 0
for letters in tuple_letter:
    if letters.count(name[0].lower()) >= 1:
         print(name + ", you should go to the hospital on " + tuple_week[i])
         break
    i += 1