Формирование строки Python с использованием значений из нескольких списков - PullRequest
1 голос
/ 31 января 2012

Я пытаюсь отформатировать строку, используя значения из нескольких списков. Ниже приведен псевдокод, но он должен дать представление об ожидаемом результате. Результатом будет комбинация каждого элемента в каждом списке: каждый человек любит есть все фрукты, занимаясь всеми хобби . Так как же это сделать в python?

Должно быть len(names)*len(fruits)*len(hobbies) возможностей (в моем примере 64)

names = ['tom','marry','jessica','john']
fruits = ['oranges','apples','grapes','bananas']
hobbies = ['dancing','sitting','bicycling','watching tv']

print '%(name)s likes to eat %(fruit)s while %(hobby)s \n'
       % {'name':names, 'fruit':fruits, 'hobby':hobbies}

Ответы [ 3 ]

5 голосов
/ 31 января 2012

Если я понимаю вашу строку «Результатом будет комбинация каждого элемента в каждом списке: каждому человеку нравятся все фрукты, занимаясь каждым хобби», вам нужна любая возможная комбинация.Вы можете сделать это способом вложенного цикла:

names = ['tom','mary','jessica','john']
fruits = ['oranges','apples','grapes','bananas']
hobbies = ['dancing','sitting','bicycling','watching tv']

for name in names:
    for fruit in fruits:
        for hobby in hobbies:
            print '%(name)s likes to eat %(fruit)s while %(hobby)s' % {'name':name, 'fruit':fruit, 'hobby':hobby}

, который выдает

tom likes to eat oranges while dancing
tom likes to eat oranges while sitting
tom likes to eat oranges while bicycling
tom likes to eat oranges while watching tv
tom likes to eat apples while dancing
[etc.]
john likes to eat bananas while bicycling
john likes to eat bananas while watching tv

, или вы можете использовать модуль itertools, который имеет функцию product, которая дает вам все возможныекомбинация списков ввода:

import itertools

for name, fruit, hobby in itertools.product(names, fruits, hobbies):
    print '%(name)s likes to eat %(fruit)s while %(hobby)s' % {'name':name, 'fruit':fruit, 'hobby':hobby}
2 голосов
/ 31 января 2012

Модуль itertools предоставляет функцию product, которая выдает все возможные кортежи:

>>> from itertools import product
>>> names = ['tom','marry','jessica','john']
>>> fruits = ['oranges','apples','grapes','bananas']
>>> hobbies = ['dancing','sitting','bicycling','watching tv']
>>> for n, f, h in product(names, fruits, hobbies):
...     print '%s likes to eat %s while %s' % (n, f, h)

Вы также можете использовать кортеж напрямую:

>>> for t in product(names, fruits, hobbies):
...     print '%s likes to eat %s while %s' % t
2 голосов
/ 31 января 2012

Просто используйте цикл for:

names = ['tom','marry','jessica','john']
fruits = ['oranges','apples','grapes','bananas']
hobbies = ['dancing','sitting','bicycling','watching tv']

for name in names:
    for fruit in fruits:
        for hobby in hobbies:
            print '%(name)s likes to eat %(fruit)s while %(hobby)s' \
                   % {'name': name, 'fruit': fruit, 'hobby': hobby}

Но, если вы спросите меня, я всегда думаю, что все выглядит лучше с .format():

for name in names:
    for fruit in fruits:
        for hobby in hobbies:
            print '{} likes to eat {} while {}'.format(name, fruit, hobby)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...