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

时间:2013-02-13 22:18:56

标签: python list tuples

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

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

我真的不在乎“无”的类型。我只想把它们作为一个单独的列表。

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

任何帮助都将不胜感激。

6 个答案:

答案 0 :(得分:9)

对于包含元组的单个列表,最简单的是:

[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: Understanding nested list comprehension

答案 1 :(得分:5)

您可以使用与列表元素相同的方式处理元组内的元素:使用索引。例如:

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

答案 2 :(得分:0)

如果你只想在元组中存在None

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

这会为每个元组重新创建一个包含None的元组。请注意,如果你想要总共None个,那么这不是一个好的解决方案。 / p>

答案 3 :(得分: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}在那个表达上。


来自你的评论:

  

抱歉,这些数字是索引值。

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

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

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

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

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

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