我有一个这样的清单:
[[(video1,4)], [(video2,5),(video3,8)], [(video1,5)], [(video5, 7), (video6,9)]...]
此列表中的每个项目可能包含单个数据对或元组,我想将此列表更改为
[(video1,4),(video2,5),(video3,8),(video1,5),(video5,7),(video6,9)...]
然后这样做:
for item in list:
reqs = reqs + item[1]
b.append(item[0])
c = set(b)
我不知道如何更改列表结构,或者如何根据原始列表进行相同的计算?
答案 0 :(得分:6)
如果您只想展开列表,只需使用itertools.chain.from_iterable
:http://docs.python.org/library/itertools.html#itertools.chain.from_iterable
答案 1 :(得分:5)
使用列表推导有一种非常简单的方法。 python文档here
中记录了此示例>>> # flatten a list using a listcomp with two 'for'
>>> vec = [[1,2,3], [4,5,6], [7,8,9]]
>>> [num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
以下是您希望实施的解决方案。根据您的示例,这是最简单的解决方案
In [59]: your_list = [[('video1',4)], [('video2',5),('video3',8)], [('video1',5)], [('video5', 7), ('video6',9)]]
In [60]: improved_list = [num for elem in your_list for num in elem]
In [61]: improved_list
Out[61]:
[('video1', 4),
('video2', 5),
('video3', 8),
('video1', 5),
('video5', 7),
('video6', 9)]
答案 2 :(得分:3)
要展平一个级别,您可以使用itertools.chain.from_iterable()
:
flattened_list = itertools.chain.from_iterable(my_list)
答案 3 :(得分:2)
这是另一个(没有图书馆):
def plus(a,b): return a + b
reduce(plus, your_list)
答案 4 :(得分:1)
试试这个:
from itertools import chain
c = set()
reqs = 0
for vid, number in chain(*your_list):
c.add(vid)
reqs += number
另请参阅相关帖子Flattening a shallow list in Python。
使用chain.from_iterable(list)
而非chain(*list)
的性能提升可以忽略不计,但前者看起来更清晰。
答案 5 :(得分:1)
如果此列表是单独嵌套(列表列表),您可以执行此操作,我使用大量:
flat_list = sum(list_of_lists, [])
这是因为sum总是简单地将列表相加,并且按照预期在python中添加列表:)
注意:效率低,有些人说不可读。
答案 6 :(得分:-1)
从数据结构中提取所有元组...
def get_tups(y):
z = []
if y:
for x in y:
if isinstance(x, tuple):
z.append(x)
else:
z.extend(get_tups(x))
return z
也许......