簡體   English   中英

填充列表列表以使其等於最大列表的大小

[英]padding a list of lists to make it equal to the size of the largest list

我有一個句子列表列表,我想填充所有句子,使它們具有相同的長度。

我能夠做到這一點,但我正在努力尋找最佳的方式來做事並挑戰自己。

max_length = max(len(sent) for sent in sents)
list_length = len(sents)
sents_padded = [[pad_token for i in range(max_length)] for j in range(list_length)]
for i,sent in enumerate(sents):
    sents_padded[i][0:len(sent)] = sent 

我使用了輸入:

sents = [["Hello","World"],["Where","are","you"],["I","am","doing","fine"]]
pad_token = "Hi"

我的方法是一種有效的方法還是有更好的方法?

這是在 itertools(在 python3 中)中提供的,用於迭代,使用 zip_longest,您可以使用 zip(*) 正常反轉,如果您更喜歡迭代器,則將其傳遞給列表。

import itertools
from pprint import pprint

sents = [["Hello","World"],["Where","are","you"],["I","am","doing","fine"]]
pad_token = "Hi"

padded = zip(*itertools.zip_longest(*sents, fillvalue=pad_token))
pprint (list(padded))

[['你好','世界','嗨','嗨'],
['在哪里','在','你','嗨'],
['我做得很好']]

以下是如何使用str.ljust()填充每個字符串,並使用max()len鍵來查找填充每個字符串的數字:

lst = ['Hello World', 'Good day!', 'How are you?']

l = len(max(lst, key=len)) # The length of the longest sentence
lst = [s.ljust(l) for s in lst] # Pad each sentence with l

print(lst)

Output:

['Hello World ',
 'Good day!   ',
 'How are you?']

假設:

output 應該與 OP output 相同(即每個子列表中的字數相同)。

輸入:

sents = [["Hello","World"],["Where","are","you"],["I","am","doing","fine"]]
pad_token = "Hi"

以下 1-liner 產生與 OP 代碼相同的 output。

sents_padded = [sent + [pad_token]*(max_length - len(sent)) for sent in sents]

print(sents_padded)
# [['Hello', 'World', 'Hi', 'Hi'], ['Where', 'are', 'you', 'Hi'], ['I', 'am', 'doing', 'fine']]

當我計時時,這似乎更快:

maxi = 0
for sent in sents:
    if sent.__len__() > maxi:
        maxi = sent.__len__()
for sent in sents:
    while sent.__len__() < maxi:
        sent.append(pad_token)
print(sents)

暫無
暫無

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

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