Python: 完整列表与项目

1 投票
6 回答
1620 浏览
提问于 2025-04-18 15:25

假设我有很多列表。这些列表的长度可能各不相同。我想做的事情是用一个字符串,比如“EMPTY”,来填充每个列表。有没有什么内置的函数或者非常简单的命令可以做到这一点呢?

我觉得可以用两个循环来实现。

for list in lists:
    for i in range(0,10):
        try:
            val = list[i]
        except IndexError:
            // list[i] = "EMPTY" 
            list.append("EMPTY")

大家都知道,Python有很多处理字符串、列表等的小功能,所以我想问问有没有更简单的方法。

比如:

for list in lists:
    list.complete("EMPTY",10)

6 个回答

0

嗯,也许可以稍微短一点。

n = 10 
for l in lists:
    l.extend((("EMPTY "*(n-len(l))).split())
0

这可以通过 itertools.iziplongestfillvalue 参数轻松实现。

首先,导入必要的模块,并创建你的数据:

>>> import pprint
>>> import itertools
>>> lists = (list('abc'), list('defg'), list('hijkl'))
>>> lists
(['a', 'b', 'c'], ['d', 'e', 'f', 'g'], ['h', 'i', 'j', 'k', 'l'])

现在,我们可以根据最长的列表来合并它们,并使用你想要的填充值:

>>> pprint.pprint(list(itertools.izip_longest(*lists, fillvalue='EMPTY')))
[('a', 'd', 'h'),
 ('b', 'e', 'i'),
 ('c', 'f', 'j'),
 ('EMPTY', 'g', 'k'),
 ('EMPTY', 'EMPTY', 'l')]

最后,演示如何转置这些列表,以便得到你想要的最终结果:

>>> pprint.pprint(list(zip(*itertools.izip_longest(*lists, fillvalue='EMPTY'))))
[('a', 'b', 'c', 'EMPTY', 'EMPTY'),
 ('d', 'e', 'f', 'g', 'EMPTY'),
 ('h', 'i', 'j', 'k', 'l')]
1

我相信有很多方法可以做到这一点,但这是我首先想到的:

def complete_lists(lists, length, filler):
    for lst in lists: #btw, don't use list as a variable name
        lst.extend([filler for i in range(len(lst), length)])

你也可以用一个看起来很吓人的一行代码来实现,挺有趣的:

def complete_lists(lists, length, filler):
    __ = [lst.extend([filler for i in range(len(l), length)]) for lst in lists]
1
for alist in lists:
    alist.extend(["EMPTY"]*(10-len(alist))

也许?这只是完成这个任务的众多方法之一...

2

有很多方法可以做到这一点。这里有一种,但我并不是说这是唯一的方法:

def complete(lst, fill_value, desired_length):
    return lst + [fill_value] * (desired_length - len(lst))

如果你的 fill_value 是可变的,比如列表或字典,那这样做就不安全,但字符串是可以的。

另外,这个方法会返回一个新的列表,而不是直接修改你提供的列表。如果你想修改原来的列表:

def complete(lst, fill_value, desired_length):
    return lst.extend([fill_value] * (desired_length - len(lst)))

撰写回答