Python:使用List Comprehensions以单个逐个对象填充空列表

时间:2013-02-12 20:00:07

标签: python performance optimization list-comprehension

我有一个'词典 - 评价者'群组。对于每个组列表,我随机抽样两个(或更多值)并存储在新列表中

GroupsList = list([])
  for m in Groups:
     GroupsList.append(point_random_selection(m,n))

其中 point_random_selection

def point_random_selection(list,n):
    if n == 0:
            raise TypeError("The pulse density 0 is not iterable")
    try:
        sample_point = random.sample(list,n)
    except ValueError:
        sample_point = list
    return sample_point

GroupsList = [[<liblas.point.Point object at 0x00000001363A0E10>],
 [<liblas.point.Point object at 0x00000002CE52CB38>],
 [<liblas.point.Point object at 0x00000000CF516908>],
 [<liblas.point.Point object at 0x00000004293F9400>],
 [<liblas.point.Point object at 0x0000000249F67C50>],
 [<liblas.point.Point object at 0x0000000312D85A90>],
 [<liblas.point.Point object at 0x000000047DF396A0>,
  <liblas.point.Point object at 0x000000047DF14F98>]]

在某些情况下,我有两个或更多列表(例如:)

GroupsList[6]
[<liblas.point.Point object at 0x000000047DF396A0>,
 <liblas.point.Point object at 0x000000047DF14F98>]

我希望在新列表中存储一个逐列表列表,以便当我有两个或更多 liblas.point.Point对象时,逐个追加:< / p>

GroupsList = [[<liblas.point.Point object at 0x00000001363A0E10>],
     [<liblas.point.Point object at 0x00000002CE52CB38>],
     [<liblas.point.Point object at 0x00000000CF516908>],
     [<liblas.point.Point object at 0x00000004293F9400>],
     [<liblas.point.Point object at 0x0000000249F67C50>],
     [<liblas.point.Point object at 0x0000000312D85A90>],
     [<liblas.point.Point object at 0x000000047DF396A0>],
     [<liblas.point.Point object at 0x000000047DF14F98>]]

这是列表理解的最佳方法吗? ex插入

GroupsList.append(point_random_selection(m,n))

2 个答案:

答案 0 :(得分:2)

如果我理解正确,您希望使用列表推导将[[a, b], [c, d]]等嵌套列表更改为[a, b, c, d]。如果这是您正在尝试执行的操作的正确解释,则以下操作将起作用:

GroupsList = [point for lst in GroupsList for point in lst]

然而,最好通过将循环更改为以下内容来创建平面结构(将append()替换为extend()):

for m in Groups:
    GroupsList.extend(point_random_selection(m,n))

a.extend(b)(其中ab是列表)会产生与以下循环相同的行为(但效率更高):

for x in b:
    a.append(x)

答案 1 :(得分:1)

我不完全确定我正确地阅读了你的问题,但你在寻找list.extend吗?例如:

>>> a = [1, 2]
>>> a.extend([5, 1, 4])
>>> a
[1, 2, 5, 1, 4]

另外,一些一般的风格反馈:

  • Standard Python style强烈反对命名变量,例如GroupGroupsList;将它们命名为groupsgroups_list
  • list([])更容易编写为[]
  • 应该避免将参数命名为point_random_selection list,因为它会影响全局list()函数
  • 您似乎可以通过
  • 替换大部分point_random_selection
return random.sample(the_list, min(n, len(the_list))