以下是学习过程的一部分,对您的任何帮助都非常感谢!
我在对列表理解进行反向工程时遇到问题。我有一个输入数据列表:
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
它会导致错误。
知道为什么吗?如何使它像以前的示例一样工作?
答案 0 :(得分:4)
@Matt B引用了错误原因。
但是,一种有效的方法可能是:
print(list(zip_longest(tableData[0],tableData[1], tableData[2])))
甚至更好,是广义的。 (感谢@Patrick Haugh)
print(list(zip_longest(*tableData)))
输出:
[('apples', 'Alice', 'dogs'), ('oranges', 'Bob', 'cats'), ('cherries', 'Carol', 'moose'), ('banana', 'David', 'goose')]
请注意,我用
zip_longest
而不是zip
来照顾额外的 元素,例如(注意red apples
和Elon
)的数据:
tableData = [['red apples', 'apples', 'oranges', 'cherries', 'banana'],
['Alice', 'Bob', 'Carol', 'David', 'Elon'],
['dogs', 'cats', 'moose', 'goose']]
使用zip
将错过banana
和Elon
的输出:
[('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)]
答案 1 :(得分: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
更好的方法是在range
的{{1}}的{{1}}上循环,这样它的动态行为就可以改变len
的长度而无需它抛出了我认为是tableData
的信息:
tableData
答案 2 :(得分: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)
如果您已经有一个列表列表,则无需创建新的列表列表。