如何访问嵌套列表中的元组元素

6

我有一个包含嵌套列表和元组的列表。这个列表长这样:

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

我希望能够按索引位置访问元组中的“None”元素。我想创建一个新的列表,其中包含相同的索引值,如下所示:

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

我不在乎“None”的类型是什么。我只希望它们作为一个单独的列表。
我尝试使用列表推导式,但我只能检索到元组本身,而不能获取其中的元素。
任何帮助将不胜感激。

你能展示实际的列表吗(作为Python列表显示,我们可以在解释器中键入)?它是[428, [(...)], 429, [(...)], ...]吗?还是其他什么东西? - abarnert
3
在你的例子中,“None”始终是元组中的第二个值。如果是这种情况,你可以使用以下代码 [ x[1] for x in myList ] 来对myList进行操作。 - Roy Nieterau
2
另外,您尝试的列表推导式只能检索元组是什么?您不能在表达式末尾加上[1]吗? - abarnert
[y for x,y in a_list]???我可能读错了问题。 - Niclas Nilsson
6个回答

11

如果只有一个包含元组的列表,最简单的方法是:

[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:理解嵌套列表推导式

7

您可以像操作列表元素一样,使用索引操作元组内的元素。例如:

lst = [1, (2, 3)]
lst[1][1] # first index accesses tuple, second index element inside tuple
=> 3

我实际上尝试了Roy建议的列表推导式。它将所有元组放入一个大列表中。如果使用Oscar讨论的方法,我只能检索到列表中的第一个元组。 - user1882766
@user1882766:你必须给我们你实际的列表和你尝试过的实际列表推导式。如果你只是给了我们模糊的描述,那我们都只是在猜测你如何构建推导式以及在哪里放置所有索引等等,而且我们很可能会猜错。 - abarnert
1
@user1882766,我只是展示如何访问列表中的元组元素,以便处理整个列表。要处理整个列表,您需要提供一个正确形成的列表(这在问题代码中并不是这样),并且您需要遍历每个元素,可以使用列表推导或任何其他循环机制。 - Óscar López

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]

如果它不是你实际拥有的,那么你实际拥有的也同样容易更改。但你必须自己动手,因为我们在反复尝试阅读您的思想时都失败了,而您实际的代码却在您面前。


抱歉,这些数字是索引值。我包含它们是因为我想保持“Nones”在相同的索引位置。 - user1882766

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


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

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


0
如果您只想在元组中存在None时获取Nonetuple([None for t in list if None in t]) 这将重新创建一个包含每个元组中的None的元组。请注意,如果您想要总共的None数量,这不是一个好的解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接