1

我有一个列表,如果它包含任何字母,我试图获得虚假回报。当我到达如下列表时:

list = ['1', '+', 'b1'] 

我试着跑

any(characters.isalpha() for characters in list)

但它返回 False,即使 list[2] 清楚地包含一个字母。

所以我尝试执行以下操作,认为我可能没有正确迭代列表中的每个项目:

for characters in list:
  any(characters.isalpha() for char in characters)

返回

False
False
False

我不知道如何让程序发现有一个字母并返回 True 以查询列表是否包含任何字母。如果您能帮我找出答案,我将不胜感激。

4

3 回答 3

4

您需要另一个for ... in ...子句来遍历每个字符串中的每个字符:

>>> lst = ['1', '+', 'b1']
>>> any(char.isalpha() for string in lst for char in string)
True
>>>

for char in string获取由返回的每个字符串for string in lst并迭代其字符。

于 2014-06-11T23:23:49.553 回答
3
for characters in letter:
  any(characters.isalpha() for char in characters)

你有一个错字,你可能的意思是:

for characters in letter:
  any(char.isalpha() for char in characters)

此外,您可以在生成器表达式中将这两个循环合并为一个:

any(char.isalpha() for letters in list for char in letters)
于 2014-06-11T23:23:42.930 回答
0

您可以使用anyall

>>> all(character.isalpha() for item in alist for character in item)
False
>>> any(character.isalpha() for item in alist for character in item)
True
>>> ## if you want the same output as using any
>>> not all(character.isalpha() for item in alist for character in item)
True

顺便说一句,all更快(至少在这种相对较小的情况下)

>>> import timeit
>>> timeit.timeit('not all(character.isalpha() for item in ["1", "+", "b1"] for character in item)', number=10000)
0.021654181380604598
>>> timeit.timeit('any(character.isalpha() for item in ["1", "+", "b1"] for character in item)', number=10000)
0.034381219301721444

如果您更改订单,这将不成立

>>> timeit.timeit('not all(character.isalpha() for item in ["b1", "+", "1"] for character in item)', number=10000)
0.0663501940999538
>>> timeit.timeit('any(character.isalpha() for item in ["b1", "+", "1"] for character in item)', number=10000)
0.037434049209622344

所以选择其中一个很大程度上是个人喜好

于 2014-06-11T23:51:32.627 回答