Python: 完整列表与项目
假设我有很多列表。这些列表的长度可能各不相同。我想做的事情是用一个字符串,比如“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.iziplongest
的 fillvalue
参数轻松实现。
首先,导入必要的模块,并创建你的数据:
>>> 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)))