【问题标题】:Joining elements in Python list在 Python 列表中加入元素
【发布时间】:2020-01-19 19:31:07
【问题描述】:

给定一个字符串,比如s='135' 和一个列表,比如A=['1','2','3','4','5','6','7'],我怎样才能将列表中也在's'(s 的数字)中的值与其他元素分开并连接这些其他元素元素。此示例中的输出应为:A=['1','2','3','4','5','67']。 另一个例子: s='25'A=['1','2','3','4','5','6','7'] 输出:A=['1','2','34','5','67']

有没有办法在没有任何 import 语句的情况下做到这一点(这样我可以更好地了解 Python 以及它是如何工作的)?

我对编程很陌生,所以任何帮助都将不胜感激!

(请注意:这是我试图解决的更大问题的一部分)。

【问题讨论】:

  • "This is part of a larger problem that I am trying to solve" 这是什么?到目前为止,这可能是XY problem
  • s 是整数,不是字符串
  • 为什么在第一个示例中234 组合在一起? 24 不在 s 中,但 3 在。
  • 我很抱歉,我对问题的措辞不是很清楚。目的是将所有不在 s 中的元素(不是 s 的一个数字)组合在一起,并将也出现在 s 中的元素分开。
  • 对不起,是的。我现在会改变它。

标签: python arrays list sorting


【解决方案1】:

您可以将itertools.groupby 与用于测试您号码中成员资格的密钥一起使用(转换为字符串)。这将根据元素是否在s 中对它们进行分组。然后列表推导将作为字符串加入组。

from itertools import groupby

A=['1','2','3','4','5','6','7']
s=25
# make it a string so it's easier to test for membership
s = str(s)

["".join(v) for k,v in groupby(A, key=lambda c: c in s)]
# ['1', '2', '34', '5', '67']

编辑:艰难的方式

您可以遍历列表并跟踪最后看到的值。这将让您测试是否需要将新字符串附加到列表中,或者将字符附加到最后一个字符串。 (仍然 itertools 更干净):

A=['1','2','3','4','5','6','7']
s=25
# make it a string
s = str(s)

output = []
last = None

for c in A:
    if last is None:
        output.append(c)
    elif (last in s) == (c in s):
        output[-1] = output[-1] + c
    else:
        output.append(c)
    last = c

output # ['1', '2', '34', '5', '67']

【讨论】:

  • 谢谢你,马克,但是有没有办法在不导入任何东西的情况下解决这个问题?
  • 由于groupby 要求输入数组在同一个键上排序,所以不会有一个输入可以提供有趣的输出吗?
  • @bgmn 可能,但 itertools 在标准库中,它可能是你应该使用的东西。从标准库中导入东西并不丢人,它们是 Python 的一部分。
  • 但这证明他的第一个是错误的。输出将是 if s=135 ['1', '2', '3', '4', '5', '67'] [Program finished]
  • 对,@High-Octane — 这就是 OP 在 cmets 中所说的。该输出与编辑后的问题匹配。
【解决方案2】:

@Mark 的回答有点扭曲?

我认为这会产生结果。

from itertools import groupby

A=['1','2','3','4','5','6','7']
s=25
# make it a string so it's easier to test for membership
s = str(s)

print(["".join(v) for k,v in groupby(A, key=lambda c: c in s) if str(k) not in s ])
# ['1', '2', '34', '5', '67']

【讨论】:

  • str(k) 这里只是字符串TrueFalse。你为什么要测试那些是否在s
  • 哦..我以为它们是索引的,由于结果是匹配的,所以我认为它是正确的。
  • @MarkMeyer 马克,你确定吗?那我怎么得到这个答案..
  • 您会得到这个答案,因为TrueFalse 永远不会在s 中。您的if 始终为真,使您的代码与我的相同。
  • @MarkMeyer 哦,现在说得通了,谢谢马克。我会记下这个答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
  • 1970-01-01
  • 2023-02-24
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多