【问题标题】:How do I combine two lists into one, while changing some of the values?如何在更改某些值的同时将两个列表合二为一?
【发布时间】:2019-11-13 16:01:49
【问题描述】:

我正在做我的第一个编码项目,即制作一个文本编码器。完成后,我计划制作与之配对的解码器。现在,我无法让两个列表组合/重叠。如果我要展示的内容有一个引用它的实际名称,我深表歉意,我是编码新手,还在学习很多东西。

list1 = [20.0, 'X', 'X', 46.0, 0.0, 18.0, 'X', 40.0]
list2 = ['Y', 31.0, 45.0, 'Y', 'Y', 'Y', 47.0, 'Y']

我需要的输出是:

list3 = [20.0, 31.0, 45.0, 46.0, 0.0, 18.0, 47.0, 40.0]

两个列表具有相同数量的值,我需要将它们组合成一个列表,保持数字的当前顺序,并完全消除“X”和“Y”。

【问题讨论】:

  • 欢迎来到 Stack Overflow!请拿起tour,环顾四周,通读Help Center,尤其是How do I ask a good question? 如果您遇到特定问题,请彻底研究,在这里彻底搜索,如果您仍然卡住,请发布您的代码和问题的描述。另外,请记住包括Minimum, Complete, Verifiable Example。人们会很乐意提供帮助
  • 这是同时遍历两个列表的一种方法:stackoverflow.com/questions/21098350/…。您可以使用 isintance(s, str) 来测试 s 是否为字符串。您可以使用 list3.append(x) 将 x 附加到 list3。将这些结合起来,您将获得解决方案。

标签: python list


【解决方案1】:

为什么不用maxisinstance

print([max(i, key=lambda x: isinstance(x, float)) for i in zip(list1, list2)])

输出:

[20.0, 31.0, 45.0, 46.0, 0.0, 18.0, 47.0, 40.0]

【讨论】:

  • 这不是混淆比赛;-) 我们正在尝试向初学者教授基本的 Python。
【解决方案2】:

正如@Austin 所说,使用zip 组合几个相同大小的列表。

如果您是开发新手,这里有一个更容易理解的版本

def get_number(item1, item2):
    if item1 in ['X', 'Y']:
        return item2
    else:
        return item1

[get_number(x, y) for x, y in zip(list1, list2)]

输出:-

[20.0, 31.0, 45.0, 46.0, 0.0, 18.0, 47.0, 40.0]

【讨论】:

  • 没错,我们不应该对值进行硬编码,但在这种情况下,问题并不清楚。问题说我们需要消除 Xs 和 Ys,它并没有真正说明它应该是浮点值。例如,如果真的是int 会发生什么。
【解决方案3】:

如果您不认真关心组合列表的顺序,这是一个建议

list1 = [20.0, 'X', 'X', 46.0, 0.0, 18.0, 'X', 40.0]
list2 = ['Y', 31.0, 45.0, 'Y', 'Y', 'Y', 47.0, 'Y']
a = list1 + list2
a = [x for x in a if not isinstance(x, str)]
>>>a
[20.0, 46.0, 0.0, 18.0, 40.0, 31.0, 45.0, 47.0]

【讨论】:

  • 它没有以预期的形式输出。
  • @Austin,你是说列表的顺序吗?
  • 这不是 OP 要求的。输出应该是 [20.0, 31.0, 45.0, 46.0, 0.0, 18.0, 47.0, 40.0]。
  • @Austin,感谢您的提醒。我编辑了我的答案作为建议。
【解决方案4】:
list3 = [x if not str(x).isalpha() else list2[i] for i, x in enumerate(list1)]

已验证

【讨论】:

  • 呃,没有。你测试了吗?
  • 您的代码会出现在列表 [0, 1, 2, 3, 4, 5, 6, 7] 中。
  • 抱歉之前的回答...我编辑了代码并且可以正常工作
【解决方案5】:
list1 = [20.0, 'X', 'X', 46.0, 0.0, 18.0, 'X', 40.0]
list2 = ['Y', 31.0, 45.0, 'Y', 'Y', 'Y', 47.0, 'Y']

list3 = []

for x in range(len(list1)):
    if isinstance(list1[x], float):
        list3.append(list1[x])

    else:
        list3.append(list2[x])

print(list3)

输出:-

[20.0, 31.0, 45.0, 46.0, 0.0, 18.0, 47.0, 40.0]

【讨论】:

  • @jarmod 你能告诉我为什么吗?
  • 您的答案有效,但不符合标准。见python-forum.io/…
  • @jarmod 感谢您的建议。我期待着在以后的将来像你所说的那样做。
【解决方案6】:

在列表理解中使用zipisinstance

list1 = [20.0, 'X', 'X', 46.0, 0.0, 18.0, 'X', 40.0]
list2 = ['Y', 31.0, 45.0, 'Y', 'Y', 'Y', 47.0, 'Y']

list3 = [x if isinstance(x, float) else y for x, y in zip(list1, list2)]
# [20.0, 31.0, 45.0, 46.0, 0.0, 18.0, 47.0, 40.0]

【讨论】:

  • 理解表达式,zipisinntance 对于初学者来说太高级了。简单的循环和累加器更合适。
  • @Xero 我对zip 有点熟悉,尽管我仍在学习实现它的所有不同方法。但这是我第一次听说isinstance
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 2019-11-28
相关资源
最近更新 更多