gpt4 book ai didi

python 映射/减少: emit multiple keys values from single map lambda

转载 作者:行者123 更新时间:2023-11-28 21:46:42 25 4
gpt4 key购买 nike

是否有一种规范的方法可以从输入序列中的单个项目发出多个键,以便它们形成一个连续的序列,我不需要使用 reduce(...) 只是压平序列?

例如如果我想将一系列数字中的每个数字扩展为序列中的单个数字

[1,12,123,1234,12345] => [1,1,2,1,2,3,1,2,3,4,1,2,3,4,5]

然后我会写一些看起来有点像这样的 python:

somedata = [1,12,123,1234,12345]

listified = map(lambda x:[int(c) for c in str(x)], somedata)
flattened = reduce(lambda x,y: x+y,listified,[])

但如果有更简洁(或可能更有效)的方式来表达这一点,我宁愿不必调用 flattened = reduce(...)

最佳答案

map(func, *iterables) 将始终调用 func 的次数与最短可迭代对象的长度一样多(假设没有引发异常)。函数总是返回一个对象。所以 list(map(func, *iterables)) 将始终与最短的可迭代对象具有相同的长度。

因此 list(map(lambda x:[int(c) for c in str(x)], somedata)) 将始终与 somedata 具有相同的长度.没有办法解决这个问题。

如果期望的结果(例如 [1,1,2,1,2,3,1,2,3,4,1,2,3,4,5])有更多项目比输入(例如 [1,12,123,1234,12345])那么必须使用 map 以外的东西来生成它。

例如,您可以使用 itertools.chain.from_iterable展平 2 层嵌套:

In [31]: import itertools as IT

In [32]: somedata = [1,12,123,1234,12345]

In [33]: list(map(int, IT.chain.from_iterable(map(str, somedata))))
Out[33]: [1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5]

或者,要展平列表的列表,sum(..., []) 就足够了:

In [44]: sum(map(lambda x:[int(c) for c in str(x)], somedata), [])
Out[44]: [1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5]

但请注意,这比使用 IT.chain.from_iterable 慢得多(见下文)。


这是一个基准测试(使用 IPython%timeit)测试从 0 到 100 万的 10,000 个整数列表中的各种方法:

In [4]: import random
In [8]: import functools
In [49]: somedata = [random.randint(0, 10**6) for i in range(10**4)]

In [50]: %timeit list(map(int, IT.chain.from_iterable(map(str, somedata))))
100 loops, best of 3: 9.35 ms per loop

In [13]: %timeit [int(i) for i in list(''.join(str(somedata)[1:-1].replace(', ','')))]
100 loops, best of 3: 12.2 ms per loop

In [52]: %timeit [int(j) for i in somedata for j in str(i)]
100 loops, best of 3: 12.3 ms per loop

In [51]: %timeit sum(map(lambda x:[int(c) for c in str(x)], somedata), [])
1 loop, best of 3: 869 ms per loop

In [9]: %timeit listified = map(lambda x:[int(c) for c in str(x)], somedata); functools.reduce(lambda x,y: x+y,listified,[])
1 loop, best of 3: 871 ms per loop

关于 python 映射/减少: emit multiple keys values from single map lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37546459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com