【问题标题】:Iterating over a list of integers and joining items based on a condition迭代整数列表并根据条件连接项目
【发布时间】:2022-01-01 14:36:35
【问题描述】:

我正在尝试迭代整数列表并使用 python 标准库根据条件加入它们。例如,我有一个看起来像这样的整数列表:

listOfIntegers = [0, 0, 0, 2, 0, 4, 6, 0, 8, 0, 0, 0, 1, 9]

我想遍历这个列表并组合值,这样结果将是以下形式的字符串:

result = '000-20-4-60-8000-1-9'

(包括破折号的地方)。这样做的条件是,如果前面的数字不等于 0,则必须在其前面放置一个破折号。如果下一个值等于 0,则连接到前一个值的末尾。

【问题讨论】:

  • 你做了什么?请向我们展示您的代码。

标签: python string list integer iteration


【解决方案1】:

这将有助于: (考虑到给定列表中的数字是正数)

def join(lst):
    return "".join(list(map(lambda x: str(-x), lst))).lstrip('-')

listOfIntegers = [0, 0, 0, 2, 0, 4, 6, 0, 8, 0, 0, 0, 1, 9]
print(join(listOfIntegers)) # 000-20-4-60-8000-1-9

流程:

  1. 将每个元素转换为负数,其中:
    • 9 变为 -9
    • 0 无效,因为 -0 在 python 中是 0
  2. 然后将它们转换成字符串并加入它们
  3. 确保删除尾随 hyphen,在我们的例子中 lstrip('-') 可以帮助我们。

【讨论】:

  • 请注意你做了什么以及它为什么有效。这对于以后可能会看到此页面的其他人来说会更好。
  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

一种简单的方法,从整数列表构建一个字符串,然后进行简单的正则表达式替换:

listOfIntegers = [1, 0, 0, 2, 0, 4, 6, 0, 8, 0, 0, 0, 1, 9]
inp = ''.join([str(x) for x in listOfIntegers])
result = re.sub(r'(?<=.)(?=[^\D0])', '-', inp)
print(result)  # 100-20-4-60-8000-1-9

【讨论】:

  • 连接是我发现其他人为解决类似问题所做的。事实上,我很确定我已经看到了与此非常相似的解决方案。我想我没有提到的一个细节是这个整数列表中的值能够更改为 0-9 之间的任何值。如果列表的第二个条目现在是 1,会发生什么情况。无论如何,是否有自动连接过程使得结果现在是 #0-10-20-4-60-8000-1-9
  • @Dugg 我已经更新了另一个答案。
  • 这个以及上面的另一个答案都很好用,但是,如果列表被更改使得列表的第一个条目现在是 1,结果是 #-100-20-4-60 -8000-1-9 不幸的是,破折号放在了开头。有什么方法可以消除这种情况的发生,结果是#100-20-4-60-8000-1-9?到目前为止,您在这方面也提供了很多帮助。谢谢!
  • @42Dugg 检查更新的答案。我们可以在后面添加一个肯定的lookbehind,它断言只有第一个以外的字符才添加破折号。
【解决方案3】:

这是一个简单的解决方案:

listOfIntegers = [0, 0, 0, 2, 0, 4, 6, 0, 8, 0, 0, 0, 1, 9]

for i in listOfIntegers:
    if i != 0:
        print("-" + str(i), end="")
    else:
        print(str(i), end="")

对于列表中的每一项,我们检查该项是否不等于0。如果不等于0,我们打印出前面带有破折号的项目,并使用end参数避免新行。如果是 0,我们就简单的打印出来。

【讨论】:

    【解决方案4】:

    使用循环:

    def func(nums):
        result = ''
        for i, num in enumerate(nums):
            if num != 0 and i != 0:
                result += '-'
            result += str(num)
        return result
    

    【讨论】:

    • 这很好用,但是,如果列表被更改,列表的第一个条目现在是 1,结果是 #-100-20-4-60-8000-1- 9 不幸的是,破折号被放在了开头。有什么办法可以消除这种情况,结果是#100-20-4-60-8000-1-9?谢谢!
    • 很抱歉错过了那个边缘案例。我们可以简单地添加一个条件来跳过第一个数字。我已经相应地编辑了代码。
    猜你喜欢
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 2022-11-17
    • 2021-12-09
    • 1970-01-01
    相关资源
    最近更新 更多