[英]Conditional statements in List comprehension with nested lists(Python 3):
elements = ['121', '9', '55', '5']
我正在尝试检查元素列表中的任何项目是否是回文数。 如果存在,则返回 True(否则为 False)。 我尝试使用 map + lambda 来实现:这是代码片段,
print(any(map(lambda x: (all(map(lambda y: x[y] == x[-y-1], range(int(len(x)/2))))), elements )))
但我无法使用列表理解技术实现相同的想法。 有人可以请给我建议吗? 这是我所做的:
print(any([True if x[y] == x[-y-1] for y in (range(int(len/2)) for x in elements)]))
你仍然必须使用all(..)
否则你将从一个字符在字符串中回文的那一刻起返回 True :
any([all(x[y] == x[-y-1] for y in range(len(x)//2)) for x in elements])
或者您可以决定省略all(..)
,并使用slices :
any([x[:len(x)//2] == x[:len(x)//2-1:-1] for x in elements])
我们不需要在len(x)//2
处停止并使用 substring 进行相反的操作:我们可能决定将x
与x[::-1]
进行比较,但由于我们的字符串只有一半长,因此比较时间会更少长。
此外,您最好将//
用于 integer 除法:它将降低结果。
话虽这么说,在没有列表理解的情况下使用any
通常会更快:通过使用列表理解,你强制 Python 首先评估所有元素并检查它们是否是回文。 然后你要检查一个是否是。 通过使用生成器,Python 将从找到单个回文的那一刻起停止,而不检查其他元素是否为回文。
这将检查列表中的数字是否为回文。
这包括一个 function 和一个可迭代对象。
def palindrome(n):
x1 = list(str(n))
x2 = x1[::-1]
if x1 == x2 :
return True
else:
return False
elements ['121','9','55', '5']
list = [palindrome(int(n)) for n in elements]
我已经实现lambda
函数来定义双方:
elements = ['121', '9', '55', '5', '123']
count_to_middle = lambda x: len(x) // 2
left_side = lambda x: list(x[:count_to_middle(x)])
right_side = lambda x: list(reversed(x))[:count_to_middle(x)]
array = [left_side(var) == right_side(var) for var in elements]
print array
# >>> [True, True, True, True, False]
print all(array)
# >>> False
print any(array)
# >>> True
这应该有所帮助。
在您的代码行中:
print(any([True if x[y] == x[-y-1] for y in (range(int(len/2)) for x in elements)]))
您使用range(int(len/2))
而不指定它( len(of_so.nething)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.