6

我有一个带有嵌套列表的列表,其中包含元组。该列表如下所示:

428 [(' whether', None), (' mated', None), (' rooster', None), ('', None)]
429 [(' produced', None), (' without', None), (' rooster', None), (' infertile', None), ('', None)]

我希望能够访问元组的“无”元素,每个索引值。我想创建一个具有相同索引值的新列表,如下所示:

428 [(None, None, None, None)]
429 [(None, None, None, None, None)]

我真的不在乎“无”是什么类型。我只是希望它们作为一个单独的列表。

我试过列表推导,但我只能检索元组本身,而不是里面的元素。

任何帮助,将不胜感激。

4

6 回答 6

10

仅包含元组的单个列表最简单的是:

[x[1] for x in myList]
# [None, None, None, None]

或者如果它总是元组中的最后一个值(如果它包含两个以上的值):

[x[-1] for x in myList]
# [None, None, None, None]

请注意,下面的这些示例使用嵌套列表。它是一个包含元组的列表列表。我想这就是您要寻找的东西,因为您展示了列表的两种变体。

使用嵌套的理解列表:

myList =[ [(' whether', None), (' mated', None), (' rooster', None), ('', None)] ,
          [(' produced', None), (' without', None), (' rooster', None), (' infertile', None), ('', None)] ]


print [[x[1] for x in el] for el in myList]
# [[None, None, None, None], [None, None, None, None, None]]

或其他一些变体:

myList =[ [(None, None), (' mated', None), (' rooster', None), ('', None)] ,
              [(' produced', None), (' without', None), (' rooster', None), (' infertile', None), ('', None)] ]

# If there are multiple none values (if the tuple isn't always just two values)
print [ [ [ x for x in z if x == None] for z in el ] for el in myList ]
# [[[None, None], [None], [None], [None]], [[None], [None], [None], [None], [None]]]

# If it's always the last value in the tuple
print [[x[-1] for x in el] for el in myList]
# [[None, None, None, None], [None, None, None, None, None]]

另请参阅: SO:了解嵌套列表理解

于 2013-02-13T22:27:39.480 回答
6

您可以像处理列表元素一样处理元组中的元素:使用索引。例如:

lst = [1, (2, 3)]
lst[1][1] # first index accesses tuple, second index element inside tuple
=> 3
于 2013-02-13T22:22:08.017 回答
0

如果您只想获取None它是否存在于元组中:

tuple([None for t in list if None in t])

这将重新创建一个包含它所在的每个元组的元组。请注意,如果您想要总共None# of ,这不是一个好的解决方案。None

于 2013-02-13T22:26:18.620 回答
0

你展示的东西实际上并不是一个列表,而且很难猜测实际的列表可能是什么。但我会假设它是这样的:

list_o_lists = [428,
 [(' whether', None), (' mated', None), (' rooster', None), ('', None)],
 429,
 [(' produced', None),
  (' without', None),
  (' rooster', None),
  (' infertile', None),
  ('', None)]]

访问其中的元组的任何列表理解已经非常可怕:

[[tup for tup in lst] if is_sequence(lst) else lst for lst in list_o_lists]

但是修改它以访问每个元组的第二个元素是微不足道的:

[[tup[1] for tup in lst] if is_sequence(lst) else lst for lst in list_o_lists]

真的,不管你的列表理解是什么,不管它有多可怕,根据你的问题,你在某个地方把每个元组作为一个表达式,这意味着你所要做的就是[1]在那个表达式上加上一个。


从您的评论中:

对不起,数字是索引值。

认为你实际上有一些更简单的东西:

list_o_lists = [
 [(' whether', None), (' mated', None), (' rooster', None), ('', None)],
 [(' produced', None),
  (' without', None),
  (' rooster', None),
  (' infertile', None),
  ('', None)]]

然后你尝试的列表理解可能是这样的:

[[tup for tup in lst] for lst in list_o_lists]

当然这只是一个猜测,因为你还没有向我们展示你的实际列表,或者你尝试的列表理解。但正如我在上面所说的:“……不管你的列表理解是什么……在某个地方你把每个元组作为一个表达式,这意味着你所要做的就是[1]在那个表达式上加上一个。”

所以,这个和上面的一样容易改变:

[[tup[1] for tup in lst] for lst in list_o_lists]

如果它不是你实际拥有的,那么你实际拥有的将同样容易改变。但是你必须自己做,因为我们反复尝试读懂你的想法都失败了,而你面前有你的实际代码。

于 2013-02-13T22:26:39.237 回答
0

使用带有 * 的 zip 将列表扩展为 args:

x = [(' whether', None), (' mated', None), (' rooster', None), ('', None)]
stuff, nones = zip(*x)
# prints: stuff
#(' whether', ' mated', ' rooster', '')
print nones
# prints: (None, None, None, None)

zip 通过获取一堆列表并将每个参数的第一个元素放入列表中,并将第二个参数放入列表等中来工作

星号 (*) 扩展列表,因此您可以将 zip(*x) 想象为 zip(x[0],x[1], x[2],...x[n])

于 2013-02-13T23:04:05.283 回答
0

我想 428 和 429 是列表中不存在的索引。

所以,鉴于这个问题

li = [[(' whether', None), (' mated', None),
       (' rooster', None), ('', None)],

      [(' produced', None), (' without', None),
       (' rooster', None), (' infertile', None),
       ('', None)]

      ]


print [ [len(subli)*(None,)] for subli in li]

将完成这项工作。

[[(None, None, None, None)], [(None, None, None, None, None)]]

你的问题很奇怪。这些数据有什么用?

于 2013-02-14T00:07:08.387 回答