【问题标题】:Create a list from two lists based on values in another list根据另一个列表中的值从两个列表创建一个列表
【发布时间】:2018-06-20 11:51:35
【问题描述】:
list1=['String-1', 'String-2', 'String-1', 'String-1', 'String-2', 'String-2', 'String-1', 'String-2', 'String-1', 'String-2']
list2=['TEXT-1', 'TEXT-1', 'TEXT-1', 'TEXT-1', 'TEXT-1']
list3=['TEXT-2', 'TEXT-2', 'TEXT-2', 'TEXT-2']

我想根据 list1 中的值从 list2 和 list3 构造列表 4 如果 list1=String-1 中的值,则从 list2 中选择,否则从 list3 中选择

finallist=['TEXT-1', 'TEXT-2', 'TEXT-1', 'TEXT-1', 'TEXT-2', 'TEXT-2', 'TEXT-1', 'TEXT-2', 'TEXT-1', 'TEXT-2']

有什么帮助吗?

【问题讨论】:

  • zip 功能在这里可能有用。
  • 请展示你的尝试,以及它是如何行不通的。
  • 有 5 个 'String-2' 项目,但 list3 的长度是 4。你没有足够的项目去...
  • 您已经在解释算法,所以缺少的是您对该算法的实现尝试。
  • 问题不清楚但可能list4 = [x[1] if x[0][:8] == "String-1" else x[2] for x in zip(list1, list2, list3)]

标签: python python-3.x list merge


【解决方案1】:

试试这个:

finallist = [list2[0] if i == "String-1" else list3[0] for i in list1]
print(finallist)

【讨论】:

  • 只有在 list2 和 list3 中的每个项目都相同时才有效
  • 答案非常合乎逻辑且正确,但list2和list3中的项目并不相同。我的问题不知何故模棱两可!感谢您的回答。
【解决方案2】:

应该这样做:

list1=['String-1', 'String-2', 'String-1', 'String-1', 'String-2', 'String-2', 'String-1', 'String-2', 'String-1', 'String-2']
list2=['TEXT-1', 'TEXT-1', 'TEXT-1', 'TEXT-1', 'TEXT-1']
list3=['TEXT-2', 'TEXT-2', 'TEXT-2', 'TEXT-2', 'TEXT-2']

list2chosen,list3chosen = 0,0
finallist = []
for n in list1:
    if n == "String-1":
        finallist.append(list2[list2chosen])
        list2chosen += 1
    elif n == "String-2":
        finallist.append(list3[list3chosen])
        list3chosen += 1

print(finallist)

【讨论】:

  • 谢谢。正是我想要的。
  • 你可以让它更 pythonic:it2, it3 = iter(list2), iter(list3) list4 = [next(it2) if x == "String-1" else next(it3) for x in list1] 只有在 list2 & 3 有足够的数据时才有效
  • @FujiApple 完美运行!我不知道 iter() 和 next()。谢谢
  • 使用next(it2, None) 等确保列表没有足够数据时不会出错,如您的示例所示
  • 示例有错字,list2 和 list3 中的项目总和始终等于 list1 中的项目,因此您的解决方案是迄今为止最有效的。
猜你喜欢
  • 2015-12-02
  • 2018-10-24
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 2015-09-20
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多