Python:包含项目的完整列表

时间:2014-07-30 21:34:20

标签: python list syntax

假设我有很多名单。每个列表可能具有不同的长度。我想要做的是用(例如)字符串“EMPTY”完成每个列表。是否有内置函数或非常简单的命令集可以提供?

我认为2 for循环是可能的。

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

每个使用Python的人都知道,Python有大量的小功能可以处理字符串,列表等...所以我的问题是是否有更简单的方法。

例如:

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

6 个答案:

答案 0 :(得分: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)))

答案 1 :(得分:1)

for alist in lists:
    alist.extend(["EMPTY"]*(10-len(alist))
可能吗?作为完成此任务的众多方法之一...

答案 2 :(得分: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)])

你也可以在一个可怕的oneliner上做到这一点:

def complete_lists(lists, length, filler):
    __ = [lst.extend([filler for i in range(len(l), length)]) for lst in lists]

答案 3 :(得分:0)

好吧也许有点短暂

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

答案 4 :(得分:0)

使用fillvalue

itertools.iziplongest参数很容易做到这一点

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

>>> 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')]

答案 5 :(得分:0)

您可能希望在列表中附加而不是字符串。

例如,使用:

def completeList(lst):
    while len(lst) < 10:
        lst.append(None)
    return lst

您可以执行以下操作:

for lst in lists:
    lst = completeList(lst)

这会变成:

lists = [[1, 2, 4], 
         ['one', 'two', 'three', 'four', 'five'], 
         ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']]

分为:

Out: [[1, 2, 4, None, None, None, None, None, None, None],
      ['one', 'two', 'three', 'four', 'five', None, None, None, None, None],
      ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']]

使用只会稍微提高效率,但可能会让您稍后在代码中对列表执行更直接的操作。例如,在字符串“EMPTY”不会的情况下,None将评估为false。