gpt4 book ai didi

python - Python 3 中列表操作从左到右的应用

转载 作者:行者123 更新时间:2023-12-03 01:04:50 25 4
gpt4 key购买 nike

有没有可能的方法来实现Python中列表上操作的非延迟从左到右调用?

例如斯卡拉:

 val a = ((1 to 50)
.map(_ * 4)
.filter( _ <= 170)
.filter(_.toString.length == 2)
.filter (_ % 20 == 0)
.zipWithIndex
.map{ case(x,n) => s"Result[$n]=$x"}
.mkString(" .. "))

a: String = Result[0]=20 .. Result[1]=40 .. Result[2]=60 .. Result[3]=80

虽然我意识到很多人不喜欢上述语法,但我喜欢从左到右移动并添加任意操作的能力。

当存在三个或更多操作时,Python for 理解在我看来并不容易阅读。结果似乎是我们需要将所有内容分解成 block 。

[f(a) for a in g(b) for b in h(c) for ..]

提到的方法有机会吗?

注意:我尝试了一些库,包括 toolz.functoolz。 Python 3 延迟求值使这一问题变得复杂:每个级别都返回一个 map 对象。此外,它是否可以对输入列表进行操作并不明显。

最佳答案

@JohanL 的答案很好地了解了标准 python 库中最接近的等效项。

我最终在 2019 年 11 月改编了 Matt Hagy 的要点,现在位于 pypi

https://pypi.org/project/infixpy/

from infixpy import *
a = (Seq(range(1,51))
.map(lambda x: x * 4)
.filter(lambda x: x <= 170)
.filter(lambda x: len(str(x)) == 2)
.filter( lambda x: x % 20 ==0)
.enumerate()
.map(lambda x: 'Result[%d]=%s' %(x[0],x[1]))
.mkstring(' .. '))
print(a)

# Result[0]=20 .. Result[1]=40 .. Result[2]=60 .. Result[3]=80

其他答案中描述的其他方法

旧方法

我在 2018 年秋季发现了一个更有吸引力的工具包

https://github.com/dwt/fluent

enter image description here

对可用的第三方库进行相当彻底的审查后,似乎Pipe https://github.com/JulienPalard/Pipe最适合需求。

您可以创建自己的管道函数。我用它来处理如下所示的一些文本。粗体线是工作发生的地方。所有这些 @Pipe 东西我只需要编码一次,然后就可以重复使用。

这里的任务是关联第一个文本中的缩写:

rawLabels="""Country: Name of country
Agr: Percentage employed in agriculture
Min: Percentage employed in mining
Man: Percentage employed in manufacturing
PS: Percentage employed in power supply industries
Con: Percentage employed in construction
SI: Percentage employed in service industries
Fin: Percentage employed in finance
SPS: Percentage employed in social and personal services
TC: Percentage employed in transport and communications"""

在第二个文本中使用关联标签:

mylabs = "Country Agriculture Mining Manufacturing Power Construction Service Finance Social Transport"

这是功能操作的一次性编码(在后续管道中重用):

@Pipe
def split(iterable, delim= ' '):
for s in iterable: yield s.split(delim)

@Pipe
def trim(iterable):
for s in iterable: yield s.strip()

@Pipe
def pzip(iterable,coll):
for s in zip(list(iterable),coll): yield s

@Pipe
def slice(iterable, dim):
if len(dim)==1:
for x in iterable:
yield x[dim[0]]
elif len(dim)==2:
for x in iterable:
for y in x[dim[0]]:
yield y[dim[1]]

@Pipe
def toMap(iterable):
return dict(list(iterable))

这是大结局:一切都在一个管道中:

labels = (rawLabels.split('\n') 
| trim
| split(':')
| slice([0])
| pzip(mylabs.split(' '))
| toMap )

结果:

print('labels=%s' % repr(labels))

labels={'PS': 'Power', 'Min': 'Mining', 'Country': 'Country', 'SPS': 'Social', 'TC': 'Transport', 'SI': 'Service', 'Con': 'Construction', 'Fin': 'Finance', 'Agr': 'Agriculture', 'Man': 'Manufacturing'}

关于python - Python 3 中列表操作从左到右的应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49001986/

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