簡體   English   中英

Python:列表解析無法正常工作

[英]Python: List comprehension not working correctly

以下是學習過程的一部分,非常感謝您的幫助!

我在對列表理解進行反向工程時遇到問題。 我有一個輸入數據列表:

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引用。

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

使用itertools.zip_longest

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來處理額外的元素, zip_longest ,例如(注意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次循環( range(4) ),以循環內部只有3個元素的tableData

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

更好的方法是在tableDatalen range循環,這樣它可以動態運行,並且可以更改tableData的長度,而不會拋出我認為是IndexError

i = 0
out = []
for li in range(len(tableData))
    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 ,只需添加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)

如果您已經有一個列表列表,則無需創建新的列表列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM