Python:列表理解无法正常工作

问题描述 投票:1回答:3

以下是学习过程的一部分,非常感谢任何帮助!

我有一个问题逆向工程列表理解。我有一个输入数据列表:

tableData = [['apples', 'oranges', 'cherries', 'banana'],
             ['Alice', 'Bob', 'Carol', 'David'],
             ['dogs', 'cats', 'moose', 'goose']]

我想创建一个新的列表系列,如下所示:

['apples', 'Alice', 'dogs']
['oranges', 'Bob', 'cats']
['cherries', 'Carol', 'moose']
['banana', 'David', 'goose']

我可以这样做:

i = 0
for li in range(4):
    out = [item[i] for item in tableData]
    print(out)
    i += 1

但是,当我尝试使用时:

i = 0
out = []
for li in range(4):
    for item in tableData:
        out.append(item[i])
        print(out)
        i += 1

它会导致错误。

知道为什么吗?我怎样才能像以前的例子那样使用它?

python python-3.x python-3.7
3个回答
4
投票

@Matt B引用了错误背后的原因。

但是,这里有效的方法可能是:

使用itertools.zip_longest

print(list(zip_longest(tableData[0],tableData[1], tableData[2])))

甚至更好,一般化。 (感谢@Patrick Haugh)

print(list(zip_longest(*tableData)))

OUTPUT:

[('apples', 'Alice', 'dogs'), ('oranges', 'Bob', 'cats'), ('cherries', 'Carol', 'moose'), ('banana', 'David', 'goose')]

注意,我使用zip_longest而不是zip来处理额外的元素,包括数据(注意red applesElon):

tableData = [['red apples', 'apples', 'oranges', 'cherries', 'banana'],
             ['Alice', 'Bob', 'Carol', 'David', 'Elon'],
             ['dogs', 'cats', 'moose', 'goose']]

使用zip会错过bananaElon给出一个输出:

[('red apples', 'Alice', 'dogs'), ('apples', 'Bob', 'cats'), ('oranges', 'Carol', 'moose'), ('cherries', 'David', 'goose')]

但是使用longest_zip会将缺失值插入None

[('red apples', 'Alice', 'dogs'), ('apples', 'Bob', 'cats'), ('oranges', 'Carol', 'moose'), ('cherries', 'David', 'goose'), ('banana', 'Elon', None)]

4
投票

它抛出一个错误,因为你做了一个循环4次(range(4))循环tableData,里面只有3个元素。

i = 0
out = []
for li in range(3): # <<< Change to 3
    for item in tableData:
        out.append(item[i])
        print(out)
        i += 1

更好的是循环rangelentableData,这样它的动态行为你可以改变tableData的长度而不抛出我认为是IndexError

i = 0
out = []
for li in range(len(tableData))
    for item in tableData:
        out.append(item[i])
        print(out)
        i += 1

4
投票

如果你想要打印出tableData里面的列表,那么你可以写:

for item in tableData:
    print(item)

马特B的例子:

 i = 0
    out = []
    for li in range(len(tableData)):
        for item in tableData:
            out.append(item[i])
            print(out)
            i += 1

这也会导致错误,因为i将超出范围。你不必初始化i,你可以用item附加。

 out = []
 # No nested for loop. this will cause duplicates of the list
 for item in tableData:
      out.append(item) #<<< No need for item[i]
 print(out)

如果您已有列表列表,则无需创建新的列表列表。

© www.soinside.com 2019 - 2024. All rights reserved.