我有一个包含嵌套列表的列表,其中包含元组。该列表如下所示:
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)]
我真的不在乎“无”的类型。我只想把它们作为一个单独的列表。
我尝试过列表推导,但我只能检索元组本身,而不是里面的元素。
任何帮助都将不胜感激。
答案 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]]
答案 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)]]
你的问题很奇怪。这些数据的用途是什么?