【问题标题】:Adding comma every 3 digit problem, in python, what's different using list or using format在python中每3位数添加逗号问题,使用列表或使用格式有什么不同
【发布时间】:2021-01-14 05:01:14
【问题描述】:

我正在网站上练习算法。

我想每 3 位添加数据(数字)逗号(,)。

但我创建的变量“a”不能作为收集答案。

但我搜索的变量“b”是收集答案。

你能告诉我为什么'a'和'b'不一样

length = 8
data = "12421421"

inv_result = []
for index in range(length):
    if index % 3 == 0:
        inv_result.append(',')
        inv_result.append(str(data[index]))
    else:
        inv_result.append(str(data[index]))

result = inv_result[::-1]

#first comma delete
result.pop()

a = ''.join(result)
b = format(int(datas),",")

print(a)
print(b)
print(a == b)

结果是

12,412,421
12,421,421
False

【问题讨论】:

  • 什么是datas
  • 因为您的代码会随机排列数字。如果你仔细看,一个字符串是'12,412,421',另一个是'12,421,421'
  • 如果您在测试时尝试了其他示例。例如data = "12345678" 您可能会立即明白出了什么问题。始终尝试测试各种数据。这个例子看起来“几乎正确”,因为这个数字“几乎是一个回文”,与一个明显非常错误的例子相比,这可能会让人感到困惑。
  • 谢谢!我错过了。 :)

标签: python algorithm digits


【解决方案1】:

您的问题是您一开始没有反转数据。以下(稍微清理过的)代码有效:

length = 8
data = "12421421"
inv_data = data[::-1]
inv_result = []
for index in range(length):
    if index % 3 == 0:
        inv_result.append(',')
    inv_result.append(str(inv_data[index]))

result = inv_result[::-1]

#first comma delete
result.pop()

a = ''.join(result)
b = format(int(data),",")

print(a)
print(b)
print(a == b)

【讨论】:

    【解决方案2】:

    因为你用这条线倒退了:

    result = inv_result[::-1]
    

    如果您没有颠倒顺序,那么您将获得正确的顺序。

    result = inv_result
    result.pop(0) # remove first character which is a comma
    

    但这只有在位数是三的倍数时才有效。例如,如果您的数字是 1234,那么这样做会导致 123,4 而不是所需的 1,234。

    所以你必须在开头反转字符串或以相反的顺序遍历它。然后像以前一样保留后面的反转和 pop()。

    for index in range(length):
        if index % 3 == 0:
            inv_result.append(',')
        inv_result.append(str(inv_data[-1-index]))# count from -1 to more negative, equivalent to going backwards through string
    
    result = inv_result[::-1]
    
    #first comma delete
    result.pop()
    
    

    【讨论】:

    • 这实际上不是真的。如果你在没有 result = inv_result[::-1] 的情况下运行代码,你会看到结果是 ',124,214,2'
    • 另一个问题是,除非位数是三的倍数,否则它会出错......所以无论如何,事情通常都是错误的
    【解决方案3】:

    理解的解决方案:

    data         = "12421421"
    len_data     = len(data)
    triplets_num = len_data // 3
    remainder    = len_data % 3
    triplets     = [data[:remainder]] if remainder else []
    triplets    += [data[remainder+i*3:remainder+3+i*3] for i in range(triplets_num)]
    result       = ','.join(triplets)
    print(result)
    

    【讨论】:

      猜你喜欢
      • 2019-04-11
      • 2020-09-08
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-28
      相关资源
      最近更新 更多