Python 列表和字母顺序限制

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) 谢谢首先,无需重新创建

我正在尝试编写一个程序,要求用户提供一个名称列表,并打印以字母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)

谢谢

首先,无需重新创建字母表,它已经用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的原始代码中的问题,也不能解释您建议的解决方案的好处