在下面的代码中,我试图从列表中提取所有数字可被2整除的数字。以下代码可以正常工作。
l = range(100,401)
n=[]
for i in l:
s =str(i)
if all([int(s[0])%2==0,int(s[1])%2==0,int(s[2])%2==0]):
n.append(s)
print(",".join(n))
我试图插入for循环以避免明确地写出所有三个条件。
l = range(100,401)
n=[]
ss=[]
for i in l:
s =str(i)
ss.append(s)
for element in ss:
for j in range(3):
if int(element[j])%2==0:
n.append(element)
print(n)
我无法获得所需的输出。不仅如此,输出列表的元素' n'偶数索引打印两次。我无法弄明白为什么?
感谢。
答案 0 :(得分:2)
生成器表达式检查是否all()
元素评估为True
来拯救:
l = range(100,401)
n=[]
for i in l:
s = str(i)
if all(int(ch) % 2 == 0 for ch in s):
n.append(s)
print(",".join(n))
现在,即使您使用更多数字,它也能正常工作。
感谢@jpp关于生成器表达的建议!
这里有更快替代方案,您可以评估any()
是否因2而无法分割。
l = range(100,401)
n=[]
for i in l:
s = str(i)
if any(int(ch) % 2 != 0 for ch in s):
continue
else:
n.append(s)
print(",".join(n))
答案 1 :(得分:1)
你可以这样做:
l = range(100, 401)
n = []
for i in l:
v = 0
for j in str(i):
if int(j) % 2 == 0:
v += 1
if v == len(str(i)):
n.append(str(i))
print(",".join(n))
或者有一些列表理解:
l = range(100, 401)
n = []
for i in l:
if all(int(j) % 2 == 0 for j in str(i)):
n.append(str(i))
print(",".join(n))
或者更多列表理解:
l = range(100, 401)
n = [str(i) for i in l if all(int(j) % 2 == 0 for j in str(i))]
print(",".join(n))
或者荒谬的最小化:
print(",".join([str(i) for i in range(100, 401) if all(int(j) % 2 == 0 for j in str(i))]))
l = range(100,401)
n = []
ss = []
for i in l: # You don't need this loop, you are just making a new list with string values instead of integers. You could make that on the fly.
s = str(i)
ss.append(s)
for element in ss:
for j in range(3):
if int(element[j]) % 2 == 0: # This only check if the current digit is pair and it append the whole number to the list. You have to check if the 3 numbers are pair AND then append it.
n.append(element)
print(n)
您的代码检查每个数字,如果是,则将数字附加到结果列表(n
)。但是你不想这样,你想检查一下这个数字的3位是否成对,所以你必须检查整个组。
例如,你可以这样做:
for element in l:
pairs = 0
for j in range(3):
if int(str(element)[j]) % 2 == 0:
pairs += 1 # Each time a digit of the number is pair, `pairs` variable increase in one
if pairs == 3: # If the 3 digits are true it append your number
n.append(str(element))
这是我对如何改进代码的第一个想法,而不是element
和pairs
我使用j
和v
,(我也不使用range(3)
,我只是迭代了弦乐数字。)
如果您正在寻找“更好”的内容,您可以尝试使用all(int(j) % 2 == 0 for j in str(i))
之类的列表理解。迭代所有数字以检查是否为对,如果所有检查都为真(如222或284),则返回true
。
请告诉我是否应该解释一下。
答案 2 :(得分:1)
试试这个方法。您无需检查所有数字。
您只需要将范围语句从range(100, 401)
更改为range (100, 401, 2)
并添加一些支票作为数字,其中第一个数字为Odd,您可以跳过所有100个数字,然后在接下来的10个系列中,您可以跳过10个如果第十位是奇数。它降低了复杂性并缩短了处理时间。
l = range(100, 401, 2)
n = []
for i in l:
s = str(i)
if int(s[0]) % 2 == 1:
remainder = i % 100
i = i - remainder + 100 - 1
continue
elif int(s[1])%2 == 1:
remainder = i % 10
i = i - remainder + 10 - 1
continue
n.append(s)
print(",".join(n))