2011-09-28 100 views
1

在C#中,如果我有一個字符串的集合,我想代表集合(而不在開頭或結尾無關評論)的逗號分隔的字符串,我可以這樣做:python是否具有與C#的Enumerable.Aggregate等效的功能?

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是否有一種優雅的方式來完成同樣的事情?

+1

你的C#代碼有可怕的表現也(比你如何能* *做到這一點),這樣因爲我不會擔心太多對你來說似乎已經足夠了...... – Blindy

+0

@Bindy,是的,我意識到,在我發佈後,並刪除了我的部分問題:) –

+0

包含輸入和輸出的示例可能會有所幫助,但聽起來像您可以使用reduce()作爲替換collect.Aggregate()的下降,但還有其他選擇。 –

回答

7

使用str.join

result = ', '.join(iterable) 

如果不是所有的集合中的項是字符串,可以使用map或發電機的表達:

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

+1,這就是你應該在C#中如何做的。 – Blindy

+0

@布林迪:當然,這很有道理。 –

0

你可以這樣做:

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

我建議查找「python list comprehensi ons「(上述[... for ...])以獲取更多信息。

+0

1.他確實說過這是一個字符串集合,所以'str'部分不是必須的。 2.即使你使用'str',列表理解不是正確的工具,使用生成器表達式。 3.請不要發佈只複製另一個答案中顯示的解決方案的答案。 – agf

1

C#Enumerable.Aggregate方法的等價物是在「reduce」方法中構建的python。 例如,

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

相關問題