【问题标题】:Python combo listPython 组合列表
【发布时间】:2019-10-29 23:45:13
【问题描述】:

我正在尝试从列表中构建名称、姓氏组合。但未能在我的循环函数中做到这一点。感谢您的帮助。

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

感谢您的帮助

【问题讨论】:

    标签: python list indexing


    【解决方案1】:

    您似乎没有在任何地方使用idx。所以这只是表示第一个列表中的哪个名字被第二个列表中的名字替换了吗?

    试试这个列表理解:

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

    【讨论】:

    • @girlrilaz 我的意思是,即使索引为 1 且列表长度仍为 2,它也可以工作。试试看
    • 这也是 O(n**2) 而我提供了 O(n) 解决方案。
    • 你的解决方案也是和我一样的O
    【解决方案2】:

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

    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

    它只是遍历组合列表并返回更改了所需索引处的元素的元素。

    您可以重新排列列表或更改它交换的索引,一切都应该是美好的。

    【讨论】:

      【解决方案3】:

      您只是列出了names 中的第一项和nn 中的名称。因此,idxnames 中的位置使用 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])
      

      【讨论】:

      • @Jab 虽然您在技术上是正确的,它产生了问题中所述的输出,但 OP 指出它不会产生他们期望的输出然后 idx == 1 (例如,如果列表是@987654332 @)
      • 已编辑,我想我误解了 OP。虽然现在这应该是 OP 的意图。
      猜你喜欢
      • 1970-01-01
      • 2022-06-14
      • 2014-05-23
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      相关资源
      最近更新 更多