Python 列表和字母顺序限制
我正在尝试编写一个程序,要求用户提供一个名称列表,并打印以字母a到M开头的名称。我当前的代码返回一个TypeError,并表示“NoneType”不可编辑Python 列表和字母顺序限制,python,list,python-3.x,input,Python,List,Python 3.x,Input,我正在尝试编写一个程序,要求用户提供一个名称列表,并打印以字母a到M开头的名称。我当前的代码返回一个TypeError,并表示“NoneType”不可编辑 lst = print(input('Enter a list of names: ')) alpha = ['a,b,c,d,e,f,g,h,i,j,k,l,m,A,B,C,D,E,F,G,H,I,J,K,L,M'] for x in alpha: if x in lst: print(x) 谢谢首先,无需重新创建
lst = print(input('Enter a list of names: '))
alpha = ['a,b,c,d,e,f,g,h,i,j,k,l,m,A,B,C,D,E,F,G,H,I,J,K,L,M']
for x in alpha:
if x in lst:
print(x)
谢谢首先,无需重新创建字母表,它已经用python的string.ascii_小写字母完成了 第二,如果您想给出多个由空格分隔的字符串,您需要使用raw_输入,然后,您需要拆分它,以便获得一个名称列表,您可以对其进行迭代,检查是否包含,等等 下面是两种不同的方式来完成您的要求:
from collections import defaultdict
from string import ascii_lowercase
lst = raw_input('Enter a list of names: ')
names = lst.split()
by_first_letter = defaultdict(list)
for name in names:
by_first_letter[name[0]].append(name)
for letter in ascii_lowercase:
if by_first_letter[letter]:
print letter, by_first_letter[letter]
另一个解决方案:
names = lst.split()
for letter in ascii_lowercase:
matches = [name for name in names if name.startswith(letter)]
if matches:
print letter, matches
from collections import defaultdict
by_first_letter = defaultdict(list)
for name in raw_input('Enter a list of names: ').split():
by_first_letter[name[0]].append(name)
for letter, names in by_first_letter.items():
print letter, names
更新:更简单、更快的解决方案:
names = lst.split()
for letter in ascii_lowercase:
matches = [name for name in names if name.startswith(letter)]
if matches:
print letter, matches
from collections import defaultdict
by_first_letter = defaultdict(list)
for name in raw_input('Enter a list of names: ').split():
by_first_letter[name[0]].append(name)
for letter, names in by_first_letter.items():
print letter, names
错误原因:
TypeError: argument of type 'NoneType' is not iterable
在您编写的代码的第4行:
if x in lst:
使用保留工时表示要检查列表lst中是否存在x。Python为您实现这一点的方法是迭代列表,这意味着将它与每个项目逐一进行比较。说它不可iterable的错误是因为它试图将lst视为列表,但它不是列表
我在下面做了一个改动,以实现我认为您正在寻找的目标:
lst = input('Enter a list of names: ').split(" ")
alpha = ['a','b','c','d','e','f','g','h','i','j','k','l','m']
for x in lst:
if x[0].lower() in alpha:
print(x)
例如:
INPUT: Andrew Matthew Zain
OUTPUT: Andrew
Matthew
循环在每个空间分割用户输入,这意味着lst实际上是一个列表。然后,您将使用缩写x[0]获取第一个字符,然后检查它是否存在于alpha中。print返回None。所以,lst是零。此外,还有很多其他问题,但这是您当前问题的根源。这是一个只有一项的列表。在alpha中,您必须在每个字母周围加引号。同样是的,不要将打印与输入或原始输入一起使用。我没有否决投票,但第一个解决方案将每个字母打印在自己的行A-Z上,后跟[]。第二种解决方案不打印任何内容。简单地说,我仍然对打印正确的结果感到困惑,但是,我只是添加了一个if,仅当名称以字母开头时才打印。所有这些都不能解释OP的原始代码中的问题,也不能解释您建议的解决方案的好处