Комбинированный список Python - PullRequest
0 голосов
/ 30 октября 2019

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

names = ['Appleby', 'Damien','James']
nn = ['James', 'Jim', 'Jimmy', 'Jimmie', 'Jamie', 'Jem']
idx = 2
combos = [[names[0], n] for n in nn]

результаты:

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

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

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

, где комбинации происходят только на предопределяемый индекс, в данном случае idx = 2

Благодарим Вас за помощь

Ответы [ 3 ]

0 голосов
/ 30 октября 2019

Похоже, вы нигде не используете idx. Так что это просто означает, какое имя в первом списке заменяется именами во втором списке?

Попробуйте это понимание списка:

[[n2 if iname == idx else n1 for iname, n1 in enumerate(names)] for n2 in nn]
0 голосов
/ 30 октября 2019

Если вы не возражаете против чего-то, что не втиснуто в одну строку? Вы можете попробовать это.

def pholdercombo(lst1, index, lst2):

    if index < 0 or len(lst1) < (index - 1):
        raise ValueError('index not valid for input list')

    for s in lst2:
        cpy = list(lst1)
        cpy[index] = s
        yield cpy


names = ['Appleby', 'Damien', 'James']
nn = ['James', 'Jim', 'Jimmy', 'Jimmie', 'Jamie', 'Jem']

# throws if string not present.
idx = names.index('James')

print(list(pholdercombo(names, idx, nn)))

результат:

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

Технически он возвращает генератор, но его можно легко преобразовать в список, альтернативно повторить его или просто вызвать list нарезультат, как я.

Он просто циклически перебирает комбо-список и возвращает элементы с измененным элементом с требуемым индексом.

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

0 голосов
/ 30 октября 2019

Вы создаете список только первого элемента в names и имени в nn. Таким образом, idx находится в names, чтобы заменить срез names, используя idx и вставив в него каждое имя.

[[*names[:idx], n, *names[idx+1:]] for n in nn]

Это обеспечит замену имени на idx, еслиВы хотите, чтобы новое имя всегда было в конце, затем либо передайте приведенное выше и n до конца, либо используйте:

no_first = names[:]; del no_first[idx]
[no_first+[n] for n in nn])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...