Есть ли в Python эквивалент Cume's Enumerable.Aggregate? - PullRequest
1 голос
/ 28 сентября 2011

В 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 ]

7 голосов
/ 28 сентября 2011

Использование str.join:

result = ', '.join(iterable)

Если не все элементы в коллекции являются строками, вы можете использовать map или выражение генератора:

result = ', '.join(str(item) for item in iterable)
1 голос
/ 19 марта 2013

Эквивалент метода C # Enumerable.Aggregate - это питоны, встроенные в метод «уменьшить».Например,

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 какдругие предложили из-за неизменяемых строк питонов.

Для полноты, метод C # Enumerable.Select в python - это "map".

Теперь, если кто-нибудь спросит, вы можете сказать, что знаете MapReduce:)

0 голосов
/ 28 сентября 2011

Вы можете сделать что-то вроде:

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

Я предлагаю поискать "понимание списка python" ([... for ...] в приведенном выше) для получения дополнительной информации.

...