2015-12-01 2 views
1

Предположим, есть список объектов типа «собака», и у каждой собаки есть параметр «имя». Например:Изменить каждый элемент списка Python и объединить результаты в строку

dogs = [dog1, dog2, dog3] 

Список, состоящий из трех собак с именами Rocky, Spot и Daisy.

Я пытаюсь получить доступ к «имени» каждой собаки и создать строку типа «Роки, пятна, ромашки». Я понимаю, что мне нужно использовать List Comprehensions, но специфика оказалась сложнее, чем я думал.

Я попытался с помощью

result = (dog.name+", " for dog in dogs) 

но результат становится генератором, а не строку.

Я также попытался

result = ",".join(layers.name) 

, но я не нашел способ получить доступ к «название» поле каждой собаки.

Я знаю, как решить проблему с использованием грубой силы, но я бы действительно хотел реализовать изящное решение «python». Любая помощь была бы оценена!

+1

Вы почти там - просто объедините свои два решения: result = ','. Join (dog.name для собаки у собак) – rodion

+1

вы пробовали 'result =", ".join ([dog.name for собака в собаках]) '? –

+0

@KacperReutt - это похоже на ответ, а не на комментарий –

ответ

3

Вы можете подключить генератор к соединению.

>>> ", ".join(dog.name for dog in dogs) 
'Rocky, Spot, Daisy' 
+0

Нет необходимости в дополнительных '[]'. –

1

Это:

result = (dog.name+", " for dog in dogs) 

является генератором понимание/выражение не список понимания. Вы можете использовать это, например, так:

>>> dogs = ['Rocky', 'Spot', 'Daisy'] 
>>> result = (dog for dog in dogs) 
>>> for dog in result: 
...  print(dog) 
... 
Rocky 
Spot 
Daisy 

Или для вашего конкретного случая:

>>> result = (dog for dog in dogs) 
>>> ', '.join(result) 
'Rocky, Spot, Daisy' 
+0

Но 'dogs' - это список объектов' dog' с параметром 'name'. Не список имен. –

+0

IT будет работать одинаково с классом, я не воссоздал его класс в моем интерпретаторе, но концепция такая же. Он уже создал объект-генератор, теперь ему просто нужно его потреблять. – IanAuld

7

Вы должны объединить генератор с join:

result = ', '.join(dog.name for dog in dogs) 
+0

это поражает меня, как самый возможный ответ на Pythonic. –

1

Если вы объедините список понимание с ", ".join вы получаете:

result = ", ".join([dog.name for dog in dogs])

+0

Нет необходимости в понимании списка; выражение генератора работает так же хорошо. –

+0

@JoshCaswell, вы правы, вы также можете использовать 'result =", ".join ((dog.name для собаки у собак))'. В этом случае это действительно не имеет никакого значения. –

Смежные вопросы