繁体   English   中英

带嵌套列表的列表理解中的条件语句(Python 3):

[英]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 进行相反的操作:我们可能决定将xx[::-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM