使用循环来描述多个条件

时间:2018-05-29 16:26:45

标签: python python-3.x for-loop

在下面的代码中,我试图从列表中提取所有数字可被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'偶数索引打印两次。我无法弄明白为什么?

感谢。

3 个答案:

答案 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))]))

解释

OP请我解释为什么他的代码不起作用。我会在一些步骤中完成它,并对其进行优化:

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))

这是我对如何改进代码的第一个想法,而不是elementpairs我使用jv,(我也不使用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))