猿问

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

我有一个句子列表列表,我想填充所有句子,使它们的长度相同。


我能够做到这一点,但我正在努力寻找最佳的做事方式和挑战自己。


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"

我的方法是一种有效的方法还是有更好的方法?


慕后森
浏览 109回答 4
4回答

MM们

这是在 itertools(在 python3 中)中提供的,用于迭代,带有 zip_longest,您可以使用 zip(*) 正常反转它,如果您更喜欢它而不是迭代器,则将其传递给列表。import itertoolsfrom pprint import pprintsents = [["Hello","World"],["Where","are","you"],["I","am","doing","fine"]]pad_token = "Hi"padded = zip(*itertools.zip_longest(*sents, fillvalue=pad_token))pprint (list(padded))[['Hello', 'World', 'Hi', 'Hi'],['Where', 'are', 'you', 'Hi'],['I', 'am', 'doing', '美好的']]

蝴蝶不菲

以下是如何使用str.ljust()填充每个字符串,并使用max()keylen来查找填充每个字符串的数字:lst = ['Hello World', 'Good day!', 'How are you?']l = len(max(lst, key=len)) # The length of the longest sentencelst = [s.ljust(l) for s in lst] # Pad each sentence with lprint(lst)输出:['Hello World ', 'Good day!   ', 'How are you?']

波斯汪

假设:输出应与 OP 输出相同(即每个子列表中的单词数相同)。输入:sents = [["Hello","World"],["Where","are","you"],["I","am","doing","fine"]]pad_token = "Hi"以下 1-liner 产生与 OP 代码相同的输出。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 = 0for sent in sents:&nbsp; &nbsp; if sent.__len__() > maxi:&nbsp; &nbsp; &nbsp; &nbsp; maxi = sent.__len__()for sent in sents:&nbsp; &nbsp; while sent.__len__() < maxi:&nbsp; &nbsp; &nbsp; &nbsp; sent.append(pad_token)print(sents)
随时随地看视频慕课网APP

相关分类

Python
我要回答