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

Python:列表理解无法正常工作,python,python-3.x,python-3.7,Python,Python 3.x,Python 3.7,下面是学习过程的一部分,非常感谢您的帮助 我有一个问题,逆向工程列表理解。我有一个输入数据列表: tableData = [['apples', 'oranges', 'cherries', 'banana'], ['Alice', 'Bob', 'Carol', 'David'], ['dogs', 'cats', 'moose', 'goose']] 我想创建一系列新的列表,如下所示: ['apples', 'Alice', 'dogs'

下面是学习过程的一部分,非常感谢您的帮助

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

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
它会导致错误


知道为什么吗?我如何才能让它像前一个例子那样工作?

错误背后的原因已被@Matt B引用

然而,这里的有效方法可以是:

使用:

或者更好,广义的。(感谢@Patrick Haugh)

输出

[('apples', 'Alice', 'dogs'), ('oranges', 'Bob', 'cats'), ('cherries', 'Carol', 'moose'), ('banana', 'David', 'goose')]
注意,我使用了
zip\u longest
而不是
zip
来处理额外的数据 元素,例如数据(注意
redapples
Elon
):

使用
zip
将错过
banana
Elon
的输出:

[('red apples', 'Alice', 'dogs'), ('apples', 'Bob', 'cats'), ('oranges', 'Carol', 'moose'), ('cherries', 'David', 'goose')]
但是使用
longest\u-zip
会将缺少的值插入为
None

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

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

然而,这里的有效方法可以是:

使用:

或者更好,广义的。(感谢@Patrick Haugh)

输出

[('apples', 'Alice', 'dogs'), ('oranges', 'Bob', 'cats'), ('cherries', 'Carol', 'moose'), ('banana', 'David', 'goose')]
注意,我使用了
zip\u longest
而不是
zip
来处理额外的数据 元素,例如数据(注意
redapples
Elon
):

使用
zip
将错过
banana
Elon
的输出:

[('red apples', 'Alice', 'dogs'), ('apples', 'Bob', 'cats'), ('oranges', 'Carol', 'moose'), ('cherries', 'David', 'goose')]
但是使用
longest\u-zip
会将缺少的值插入为
None

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

它抛出一个错误,因为您进行了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

它抛出一个错误,因为您进行了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

如果希望打印出
tableData
中的列表,则可以编写:

for item in tableData:
    print(item)
Matt B的例子:

 i = 0
    out = []
    for li in range(len(tableData)):
        for item in tableData:
            out.append(item[i])
            print(out)
            i += 1
这也会导致错误,因为
i
将越界。 您不必初始化
i
,只需附加

 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)
out=[]
#没有嵌套的for循环。这将导致列表重复
对于tableData中的项目:

out.append(item)#如果您希望打印出
tableData
中的列表,那么您可以写:

for item in tableData:
    print(item)
Matt B的例子:

 i = 0
    out = []
    for li in range(len(tableData)):
        for item in tableData:
            out.append(item[i])
            print(out)
            i += 1
这也会导致错误,因为
i
将越界。 您不必初始化
i
,只需附加

 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)
out=[]
#没有嵌套的for循环。这将导致列表重复
对于tableData中的项目:

append(item)#longestzip()应该这样做,以备将来参考,“它会导致错误。”对于解决您的问题不是很有用。发布您得到的确切错误(例如,
索引器错误:列表索引超出范围
)对uslongestzip()更有用。如果Zip()可以这样做,以供将来参考,“它会导致错误。”对于解决您的问题不是很有用。发布您得到的确切错误(即
索引器:列表索引超出范围
)将对我们更有用。这可以通过使用解包
列表(zip(*tableData))
来概括。这太棒了!谢谢你添加的额外信息,非常有用的知识@JKRH不用担心,快乐编码!:)这可以通过使用解包
list(zip(*tableData))
来概括,这太棒了!谢谢你添加的额外信息,非常有用的知识@JKRH不用担心,快乐编码!:)这仍然会导致一个问题,因为列表输出会产生:['apples']['apples',Bob']['apples',Bob',moose']['apples',Bob',moose',banana'],然后抛出:indexer:list index超出范围这只会修复您遇到的错误,我建议使用@DirtyBit的优秀解决方案来获得您想要的输出,再次感谢。正如我所说的,我只是想弄清楚Python是如何工作的(超级新手!),所以这不是试图找到解决方案,而是找到方法是如何工作的。也就是说,@DirtyBit的解决方案非常好,并且已经被添加到我的有用代码片段的书中!再次感谢!没问题!我记得昨天在同一个数据集上回答了一个问题(关于查找列表中最长的单词),我假设您正在尝试更好地理解Python是如何工作的,所以我想我只给出您得到的错误信息,然后让您解决其余的问题;)是的,那也是我。这是一个从枯燥的东西(好书)中脱颖而出的实践问题。我只是想了解一下这个理论,并习惯于编写代码。真的很享受这个挑战,也很享受这个论坛上所有人的帮助!希望有一天我也能回报你!这仍然会导致一个问题,因为列表输出会产生:['apples']['apples',Bob']['apples',Bob',moose']['apples',Bob',moose',banana'],然后抛出:indexer:list index超出范围这只会修复您遇到的错误,我建议使用@DirtyBit的优秀解决方案来获得您想要的输出,再次感谢。正如我所说的,我只是想弄清楚Python是如何工作的(超级新手!),所以这不是试图找到解决方案,而是找到方法是如何工作的。也就是说,@DirtyBit的解决方案非常好,并且已经被添加到我的有用代码片段的书中!再次感谢!没问题!我记得昨天在同一个数据集上回答了一个问题(关于查找列表中最长的单词),我假设您正在尝试更好地理解Python是如何工作的,所以我想我只给出您得到的错误信息,然后让您解决其余的问题;)是的,那也是我。这是一个从枯燥的东西(好书)中脱颖而出的实践问题。只是想让我的头绕过t