python 列表理解(如果、继续、中断)
python list comprehension (if, continue, break)
我正在努力养成创建列表理解的习惯,并从根本上优化我编写的任何代码。
我做了这个小练习来确定给定数字中的所有数字是否都是偶数,当我尝试使用 for 循环创建一个列表时,if 语句 i 运行 遇到了 "continue" & "break" 的问题.
我什至可以将那些流控制插入列表吗?
我很想知道我可以将任何一段代码缩短多少。
这是我写的,我很乐意得到你们的反馈。
numbers = [str(x) for x in range(0, 10000)]
def is_all_even(nums):
temp_lst = []
evens_lst = []
for x in nums:
for y in x:
if int(y) % 2 == 0:
temp_lst.append(str(y))
continue
else:
break
if len(''.join(temp_lst[:])) == len(x):
evens_lst.append(''.join(temp_lst[:]))
del temp_lst[:]
print(evens_lst)
您可以使用列表组合,使用 all 查找包含所有偶数位的数字:
print([s for s in numbers if all(not int(ch) % 2 for ch in s)])
all
会在找到任何奇数时短路。
如果您不想一次将所有数字存储在内存中,您可以使用 generator expression:
evens = (s for s in numbers if all(not int(ch) % 2 for ch in s))
要访问您只需要遍历偶数的数字:
for n in evens:
print(n)
您还可以将过滤器用于函数式方法,其中 returns 迭代器 in python 3:
In [5]: evens = filter(lambda x: all(not int(ch) % 2 for ch in x), numbers)
In [6]: next(evens)
Out[6]: '0'
In [7]: next(evens)
Out[7]: '2'
In [8]: next(evens)
Out[8]: '4'
In [9]: next(evens)
Out[9]: '6'
[x for x in range(10000) if all(c in '02468' for c in str(x))]
您可以只将一个数字发送到一个函数,然后使用列表理解将其应用到您的列表,而不是将整个数字列表发送到该函数。
def is_all_even(num):
return all(ch in '02468' for ch in str(num))
print([n for n in range(10000) if is_all_even(n)])
我正在努力养成创建列表理解的习惯,并从根本上优化我编写的任何代码。 我做了这个小练习来确定给定数字中的所有数字是否都是偶数,当我尝试使用 for 循环创建一个列表时,if 语句 i 运行 遇到了 "continue" & "break" 的问题. 我什至可以将那些流控制插入列表吗?
我很想知道我可以将任何一段代码缩短多少。 这是我写的,我很乐意得到你们的反馈。
numbers = [str(x) for x in range(0, 10000)]
def is_all_even(nums):
temp_lst = []
evens_lst = []
for x in nums:
for y in x:
if int(y) % 2 == 0:
temp_lst.append(str(y))
continue
else:
break
if len(''.join(temp_lst[:])) == len(x):
evens_lst.append(''.join(temp_lst[:]))
del temp_lst[:]
print(evens_lst)
您可以使用列表组合,使用 all 查找包含所有偶数位的数字:
print([s for s in numbers if all(not int(ch) % 2 for ch in s)])
all
会在找到任何奇数时短路。
如果您不想一次将所有数字存储在内存中,您可以使用 generator expression:
evens = (s for s in numbers if all(not int(ch) % 2 for ch in s))
要访问您只需要遍历偶数的数字:
for n in evens:
print(n)
您还可以将过滤器用于函数式方法,其中 returns 迭代器 in python 3:
In [5]: evens = filter(lambda x: all(not int(ch) % 2 for ch in x), numbers)
In [6]: next(evens)
Out[6]: '0'
In [7]: next(evens)
Out[7]: '2'
In [8]: next(evens)
Out[8]: '4'
In [9]: next(evens)
Out[9]: '6'
[x for x in range(10000) if all(c in '02468' for c in str(x))]
您可以只将一个数字发送到一个函数,然后使用列表理解将其应用到您的列表,而不是将整个数字列表发送到该函数。
def is_all_even(num):
return all(ch in '02468' for ch in str(num))
print([n for n in range(10000) if is_all_even(n)])