python

时间:2017-07-17 11:38:55

标签: python nested-lists

我正在尝试拆分以下列表:

A_list = [[[1,2,3,4],[5,6]],          ==>[0]
          [[3,4,5],[2,3,5]],          ==>[1]
          [[5,8,9],[10,11]],          ==>[2]
          [[22,20],[5,7,8]]]          ==>[3]

为:

 x_list = [[1,2,3,4],[5,6],
           [5,8,9],[10,11]]

 y_list = [[3,4,5],[2,3,5] ,
           [22,20],[5,7,8]]

x_list有row [0],row [2]和row [4] ....

y_list包含row [1],row [3]和row [5] ...

其中每行有2个列表

有没有办法做到这一点?

感谢您的帮助或提示

我应该提到' A_list'在这个问题上已被修改。如下:

A_list = [[1,2,3,4],[5,6],          ==>[0]
      [3,4,5],[2,3,5],              ==>[1]
      [5,8,9],[10,11],              ==>[2]
      [22,20],[5,7,8]]              ==>[3]

大多数发布的答案都是在编辑之前的问题。感谢所有有用的答案。

6 个答案:

答案 0 :(得分:3)

(此答案的第一部分是在编辑问题之前编写的,更改了A_list的布局。)您的列表没有“行”。相反,您希望将第1和第2个元素分配给x_list,将第3个和第4个元素分配给y_list,将第5个和第6个分配给x_list,依此类推。

为此,您可以enumerate列表中的元素,并根据其索引模4将其分配给x_listy_list

>>> x_list = [a for i, a in enumerate(A_list) if i % 4 < 2]
>>> x_list
[[1, 2, 3, 4], [5, 6], [5, 8, 9], [10, 11]]
>>> y_list = [a for i, a in enumerate(A_list) if i % 4 >= 2]
>>> y_list
[[3, 4, 5], [2, 3, 5], [22, 20], [5, 7, 8]]

或者,您可以先将这些行创建,然后将列表分为两个条目组,然后使用切片表示法[::2][1::2]提取元素并展平那些名单再次出现:

>>> rows = [A_list[i:i+2] for i in range(0, len(A_list), 2)]
>>> x_list = [x for g in rows[::2] for x in g]
>>> y_list = [y for g in rows[1::2] for y in g]

在你默默地修改你的问题后(​​不要这样做;你使大多数现有答案无效!)你现在可以使用我的第二种方法,除了你的新A_list现在已经是rows有:

>>> x_list = [x for g in A_list[::2] for x in g]
>>> y_list = [y for g in A_list[1::2] for y in g]

答案 1 :(得分:2)

您可以使用切片语法提取所需的项目,然后使用flatten the resulting sub-lists

id1

答案 2 :(得分:1)

与Python TOOWTDI原理相反,有几种方法可以做到这一点。一种可能性是:

x_list = [A_list[i] for i in range(len(A_list)) if i % 4 < 2]
y_list = [A_list[i] for i in range(len(A_list)) if i % 4 >= 2]

另:

rows = [ A_list[i:i+4] for i in range(0, len(A_list), 4)]
x_list = [x for row in rows for x in row[0:2]]
y_list = [x for row in rows for x in row[2:4]]

以上解决方案均适用于original problem(在修改之前)。有关问题的解决方案,请参阅here

答案 3 :(得分:1)

只是一个简单的循环。

A_list = [[1,2,3,4],[5,6],[3,4,5],[2,3,5],[5,8,9],[10,11],[22,20],[5,7,8]]
x_list = []
y_list = []
V = 0
for A in A_list:
    if V % 4 < 2:
        x_list.append(A)
    else:
        y_list.append(A)
    V = V + 1

print(x_list, y_list)

答案 4 :(得分:0)

如果您假设每行只有两列,那么您可以执行以下操作:

A_list = [[1,2,3,4],[5,6],
      [3,4,5],[2,3,5],
      [5,8,9],[10,11],
      [22,20],[5,7,8]]

x_list = []
y_list = []

for x in range(len(A_list))[::4]:
    x_list.append(A_list[x])
    x_list.append(A_list[x + 1])
    y_list.append(A_list[x + 2])
    y_list.append(A_list[x + 3])

注意:仅当列数为2时才有效。如果列数不总是两个或另一个设置数,则这是一个很难完成的任务,如Python列表

 x_list = [[1,2,3,4],[5,6],
       [5,8,9],[10,11]]

相同
 x_list = [[1,2,3,4],[5,6],[5,8,9],[10,11]]

这适用于任何数量的输入。

答案 5 :(得分:-1)

你可以单独使用切片来实现这一点,而不是这样的条件:

A_list = [[1,2,3,4],[5,6],
          [3,4,5],[2,3,5],
          [5,8,9],[10,11],
          [22,20],[5,7,8]]

x_list = A_list[::4] + A_list[1::4]
y_list = A_list[2::4] + A_list[3::4]
print(x_list)  # [[1, 2, 3, 4], [5, 8, 9], [5, 6], [10, 11]]
print(y_list)  # [[3, 4, 5], [22, 20], [2, 3, 5], [5, 7, 8]]

保留订单。如果这对您来说很重要,请使用其中一个解决方案。