python是否等同于C#的Enumerable.Aggregate?

时间:2011-09-28 16:37:33

标签: c# python aggregate-functions aggregate

在C#中,如果我有一个字符串集合,并且我想获得一个逗号分隔的字符串来表示集合(在开头或结尾没有无关的注释),我可以这样做:

string result = collection.Aggregate((s1, s2) => String.Format("{0}, {1}", s1, s2));

我可以做类似

的事情
result = collection[0]
for string in collection[1:]:
    result = "{0}, {1}".format(result, string)

但这感觉就像一块污泥。 python是否有一种优雅的方式来完成同样的事情?

3 个答案:

答案 0 :(得分:7)

使用str.join

result = ', '.join(iterable)

如果集合中的所有项目都不是字符串,您可以使用map或生成器表达式:

result = ', '.join(str(item) for item in iterable)

答案 1 :(得分:1)

C#Enumerable.Aggregate方法的等价物是用“reduce”方法构建的pythons。 例如,

reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) 

计算((((1 + 2)+3)+4)+5)。这是15

这意味着你可以实现同样的目标

result = reduce(lambda s1, s2: "{0}, {1}".format(s1, s2), collection)

或者

result = reduce(lambda s1, s2: s1 + ", " + s2, collection)

在你的案例中,由于蟒蛇不可变的字符串,最好使用其他人建议的', '.join

为了完整性,python中的C#Enumerable.Select方法是“map”。

现在,如果有人问你可以说你知道MapReduce:)

答案 2 :(得分:0)

您可以执行以下操作:

> l = [ 1, 3, 5, 7]
> s = ", ".join( [ str(i) for i in l ] )
> print s
1, 3, 5, 7

我建议查阅“python list comprehensions”(上面的[... for ...])以获取更多信息。