如何在Python中flatmap元组列表列表?

2024-10-04 01:25:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用日历并从中接收元组列表列表

calendar.Calendar.yeardays2calendar(calendar.Calendar(), year, 1))

输出为:

^{pr2}$

我想把它平面映射到简单元组列表,保存它们的顺序。在Python2.7中,将深度列表映射到普通列表的最佳方法是什么?在

我想要的示例:

[(0, 0), (0, 1), (0, 2), (1, 3), (2, 4), (3, 5), (4, 6),(5, 0), (6, 1), (7, 2), (8, 3), (9, 4), (10, 5), (11, 6), (12, 0), (13, 1)...

试着从其他问题得到代码-没用。抱歉,我是python新手

UPD我从这里尝试了函数python list comprehensions; compressing a list of lists?-没用


Tags: 方法代码示例列表顺序yearcalendar平面
3条回答

试试这个:

def flatten(x):
    if isinstance(x, list):
        return [a for i in x for a in flatten(i)]
    else:
        return [x]

这个答案与此类似:https://stackoverflow.com/a/2158522/1628832,但是检查特定的list类型,而不是iterable。在

用于优化、内存效率等。。您也可以使用yield操作。在

演示

^{pr2}$

如果您使用的是Python 2,那么下面的一行程序解决方案目前可以工作:

import compiler, itertools

lpairs = [[[[(0, 0), (0, 1), (0, 2), (1, 3), (2, 4), (3, 5), (4, 6)], [(5, 0), (6, 1), (7, 2), (8, 3), (9, 4), (10, 5), (11, 6)], [(12, 0), (13, 1)]]]]

print [(x,y) for x,y in itertools.izip(*[iter(compiler.ast.flatten(lpairs))]*2)]

给出:

^{pr2}$

注意,Pythoncompiler模块已被弃用。在

Python有一个功能,可以使一个嵌套级别变平。它有一个不幸的名字itertools.chain.from_iterable()。如果应用三次,它将展平三个级别:

import itertools
flatten1 = itertools.chain.from_iterable
flattened_data = flatten1(flatten1(flatten1(your_data)))
for a, b in flattened_data:
    # whatever

更一般地说,平坦n级别的函数是

^{pr2}$

递归展平所有列表的函数如下所示:

def flatten_lists(a):
    if isinstance(a, list):
        for b in a:
            for x in flatten_lists(b):
                yield x
    else:
        yield a

相关问题 更多 >