Python组合列表

Python组合列表,python,list,indexing,Python,List,Indexing,我正试图从一个列表中建立一个名字、姓氏组合。但是在我的循环函数中没有做到这一点。谢谢你的帮助 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',

我正试图从一个列表中建立一个名字、姓氏组合。但是在我的循环函数中没有做到这一点。谢谢你的帮助

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


感谢您的帮助

您只列出了
名称
中的第一项和
nn
中的名称。因此,如果
idx
位于
names
中的何处,则使用
idx
替换切片
names
,并将每个名称插入其中

[[*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])

看起来您没有在任何地方使用
idx
。那么这只是表示第一个列表中的哪个名字被第二个列表中的名字替换了

请尝试以下列表:

[[n2 if iname == idx else n1 for iname, n1 in enumerate(names)] for n2 in nn]

如果你不介意一些不被压缩成一行的东西?你可以试试这个

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)))
从技术上讲,它返回一个生成器,但可以很容易地将其转换为list,或者迭代它,或者像我一样对结果调用
list

它只是在组合列表上循环并返回元素,其中所需索引处的元素已更改


您可以重新排列列表或更改它所交换的索引,所有的索引都应该是玫瑰色的。

@Jab虽然您在技术上正确地认为它产生了问题中所述的输出,但OP指出它不会产生他们期望的输出,然后
idx==1
(例如,如果列表是
['Appleby',James',Damien']
)编辑的,我想我误解了OP。虽然现在这应该是OP的意图。@girlrilaz,我的意思是,即使索引是1,列表长度仍然是2,它仍然有效。试一下这也是O(n**2),而我提供了一个O(n)的解决方案。你的解决方案也和我的一样
[['Appleby', 'Damien', 'James'], 
 ['Appleby', 'Damien', 'Jim'], 
 ['Appleby', 'Damien', 'Jimmy'], 
 ['Appleby', 'Damien', 'Jimmie'], 
 ['Appleby', 'Damien', 'Jamie'], 
 ['Appleby', 'Damien', 'Jem']]