Генерация списков в цикле с Python - PullRequest
1 голос
/ 28 октября 2019

Я пытаюсь создать комбинацию имени, фамилии из списка. Но не удалось сделать это в моей функции цикла. Ценю некоторую помощь.

names = ['Appleby', 'James']
nn = ['James', 'Jim', 'Jimmy', 'Jimmie', 'Jamie', 'Jem']
combos = []
for g in nn:
    names[1] = g
    combos.append(names)
print(combos)

Результаты:

[['Appleby', 'Jem'],
 ['Appleby', 'Jem'],
 ['Appleby', 'Jem'],
 ['Appleby', 'Jem'],
 ['Appleby', 'Jem'],
 ['Appleby', 'Jem']]

Чего я хотел бы достичь:

[['Appleby', 'James'],
 ['Appleby', 'Jim'],
 ['Appleby', 'Jimmy'],
 ['Appleby', 'Jimmie'],
 ['Appleby', 'Jamie'],
 ['Appleby', 'Jem']]

Ответы [ 3 ]

3 голосов
/ 28 октября 2019

Я полагаю, вы ищете все комбинации имен в двух списках. Вы можете использовать это для этого -

combos = [[name, n] for n in nn for name in names]

Если вы хотите комбинации только с 'Appleby'. Используйте

combos = [[names[0], n] for n in nn]

Проблема в том, что вы обновляете имя [1] = g. Он обновляет один и тот же список, который добавляется несколько раз в комбинации. За дополнительной информацией обращайтесь к изменяемым и неизменным объектам в python.

Для получения дополнительной информации об операторе списка += см. этот ответ .

1 голос
/ 28 октября 2019

Или используйте itertools.cycle с zip:

from itertools import cycle
combos = list(zip(cycle([names[0]]), nn))
print(combos)

Выход:

[('Appleby', 'James'), ('Appleby', 'Jim'), ('Appleby', 'Jimmy'), ('Appleby', 'Jimmie'), ('Appleby', 'Jamie'), ('Appleby', 'Jem')]
0 голосов
/ 28 октября 2019

Причина, по которой ваш код «провалился», заключалась в том, что когда вы меняли значение имен [1], вы по существу меняли значения внутри комбо. Ради этого ответа я разделю ваш список имен на имена [0] и имена [1]

Когда вы добавляли комбо, в псевдо-коде вы писали его как

combos.append([names[0], names[1]])

Списки - это набор смежных указателей. Если у вас есть список размером 10, у вас есть 10 указателей (которые указывают на значение). Не имеет смысла отправлять указатель куда-либо, поскольку он аккуратно хранится в последовательном порядке. Поэтому, когда вы изменяете значение слота в списке, вы просто меняете переменную, на которую указывает указатель.

Когда вы добавляли имена [1] в список, вы давали ему «указатель». Что дает:

combos = ([[names[0], names[1]], [names[0], names[1]], ...., [names[0], names[1]]])

Чтобы избежать передачи указателей в комбо, вы можете просто передать переменную. Переменные ни на что не указывают, поэтому, когда вы меняете переменную, вы изменяете саму переменную, а не весь список комбо.

names = ['Appleby', 'James']
nn = ['James', 'Jim', 'Jimmy', 'Jimmie', 'Jamie', 'Jem']
combos = []
for g in nn:
    combos.append([name[0],g])
print(combos)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...