简体   繁体   中英

Flatten a list in python

I have a list like this:

[[(video1,4)], [(video2,5),(video3,8)], [(video1,5)], [(video5, 7), (video6,9)]...]

each item in this list may contain a single data pair, or a tuple, I want to change this list into

[(video1,4),(video2,5),(video3,8),(video1,5),(video5,7),(video6,9)...]

then do this:

for item in list:
    reqs = reqs + item[1]
    b.append(item[0])
c = set(b)

I don't know how to change the list structure, or how to do the same calculation based on the original list?

如果您只想展平列表,只需使用itertools.chain.from_iterablehttp//docs.python.org/library/itertools.html#itertools.chain.from_iterable

There is a very simple way of doing this with list comprehensions. This example has been documented in the python documentation 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]

Here is the solution that you would want to implement. As per your example, this is the simplest solution

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

要展平一个级别,可以使用itertools.chain.from_iterable()

flattened_list = itertools.chain.from_iterable(my_list)

Here's another one (no libraries):

def plus(a,b): return a + b
reduce(plus, your_list)

Try this:

from itertools import chain 

c = set()
reqs = 0
for vid, number in chain(*your_list): 
    c.add(vid)
    reqs += number 

Also see related post Flattening a shallow list in Python .

There should be negligible performance increase from using chain.from_iterable(list) rather than chain(*list) , but it's true that the former looks cleaner.

If this list is singly-nested (list of lists) you can do this, which I use a lot :

flat_list = sum(list_of_lists, [])

This works due to the fact that sum simply adds up the lists, and adding up lists works in python as expected :)

Note : This is inefficient and some say unreadable.

to extract all tuples from a data structure ...

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

maybe ...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM