迭代不同长度的列表并设置默认值的好方法

时间:2018-06-29 08:44:44

标签: python list for-loop

在Python中,有没有一种好的方法来遍历不同长度的列表?

例如,

a = [1,2,3]

b=[4,5]

c = [a,b]

for val1, val2, val3 in c:

  print val1
  print val2
  print val3

假定该列表将至少包含2个值,并且在某些列表中,第3个值是可选的。上面的for循环不适用于b,显然,val3对列表'b'不可用。在这种情况下,我想将val3打印为0。如果不可用,可以提供默认值吗?

for val1, val2, val3=0 in c:

以上语法也不起作用。请帮忙。

5 个答案:

答案 0 :(得分:1)

如果您想花哨的话(“优雅”?),可以在给定的列表中填充零:

def pad_list(t, size, default):
    return t + [default] * (size - len(t))

for x in c:
    v1, v2, v3 = pad_list(x, 3, 0)

    print(v1)
    print(v2)
    print(v3)

类似地,如果您正在使用元组,这是另一个功能:

def pad_list(t, size, default):
    return t + (default,) * (size - len(t))

答案 1 :(得分:1)

在这种情况下,您可以将zip_longestfillvalue一起使用处理空槽:

from itertools import zip_longest

a = [1,2,3]
b = [4,5]

l = []
for x, y in zip_longest(a, b, fillvalue=0):
    l.append((x, y))

print(list(zip(*l)))
# [(1, 2, 3), (4, 5, 0)]

如果您需要不在列表中的值,只需将最后一个print替换为:

for val1, val2, val3 in zip(*l):
    print(val1)
    print(val2)
    print(val3)

# 1
# 2                                                           
# 3                                                          
# 4                                                          
# 5                                                          
# 0

答案 2 :(得分:0)

这很简单

c = [1,2,3]
val1  , val2  , *val3= [1,2 , 3]
  

val1 = 1,val2 = 3,val3 = [3]

c=[1,2]
val1  , val2  , *val3= [1,2 , 3]
  

val1 = 1,val2 = 3,val3 = []

答案 3 :(得分:0)

def foreach(l):
    def deco(f):
        for xs in l:
            f(*xs)
    return deco


@foreach([[1, 2, 3], [4, 5]])
def _(a, b, c=6):
    print(a, b, c, sep='\n')

答案 4 :(得分:0)

连接列表的最简单方法是通过chain模块中的itertools函数。

示例代码段

import itertools

a = [1, 2, 3, 4, 5, 6]
b = [7, 8, 9, 10, 11, 12]
c = ['A', 'B', 'C', 'D', 'E', 'F', 'U']


combined = itertools.chain( a, b, c ) # combines in order

# enumerate lists to allow for iteration
for index, value in enumerate(combined):
    print(value, end = ' ')

输出

1 2 3 4 5 6 7 8 9 10 11 12 A B C D E F U