【问题标题】:Combine list with sublist of different size将列表与不同大小的子列表合并
【发布时间】:2017-12-26 05:29:57
【问题描述】:

我正在尝试将两个字符串列表合并为一个,其中第一个字符串列表应用于列表 2 的所有项目。列表的长度始终相同,但是列表 2 的子列表可以包含多个列表。

我尝试过使用zip() 进行组合,如下所示:

[str(x)+'_'+str(y) for x,y in zip(list1,list2)]

但是当子列表的长度不匹配时,这不起作用。

这是我想做的一个例子:

list1 = ['H1','H2','H3','H4']
list2 = ['item1',['item2','item3'],['item4','item5','item6'],['item7','item8']]

输出应该是:

list = ['H1_item1',['H2_item2','H2_item3'],['H3_item4','H3_item5','H3_item6'],['H4_item7','H4_item8']]

【问题讨论】:

  • 是否只嵌套了一层?
  • 是的,只嵌套了一层。
  • 为什么item1 不在自己的列表中?
  • 可以多关卡吗?

标签: python string list list-comprehension


【解决方案1】:

您可以使用以下方法:

['%s_%s'%(x,y) if isinstance(y,str) else ['%s_%s'%(x,yi) for yi in y]
     for x,y in zip(list1,list2)]

这会生成:

>>> ['%s_%s'%(x,y) if isinstance(y,str) else ['%s_%s'%(x,yi) for yi in y]
...      for x,y in zip(list1,list2)]
['H1_item1', ['H2_item2', 'H2_item3'], ['H3_item4', 'H3_item5', 'H3_item6'], ['H4_item7', 'H4_item8']]

代码的工作方式如下:我们使用 - 就像您自己所做的一样 - zip(list1,list2) 来生成两个列表的元素对。现在对于每个这样的对,我们评估第一行中写的 三元运算符

三元运算符将首先检查isinstance(y,str) 是否成立(我们检查y 是否为字符串)。如果是这样,我们只需将%s_%s%(x,y) 添加到列表中。如果不是,我们评估列表理解['%s_%s'%(x,yi) for yi in y]。在这里,我们遍历yi每个 元素y,然后将%s_%s%(x,yi) 添加到子列表中。

【讨论】:

    【解决方案2】:

    您可以尝试以下方法,检查list2 中的元素是否为列表:

    [[str(x)+'_'+str(el) for el in y] if isinstance(y, list)
     else str(x)+"_"+str(y) for x,y in zip(list1,list2)]
    

    这给出了预期的输出:

    ['H1_item1',
     ['H2_item2', 'H2_item3'],
     ['H3_item4', 'H3_item5', 'H3_item6'],
     ['H4_item7', 'H4_item8']]
    

    【讨论】:

    • 大声笑,我们同时提出了几乎相同的解决方案:)
    • 争分夺秒 :)
    猜你喜欢
    • 2017-09-18
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 2018-06-06
    • 1970-01-01
    • 2012-06-01
    相关资源
    最近更新 更多