在Python中压缩相邻整数

2024-09-30 14:24:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我想这么做:

在以逗号分隔的正整数列表的输入文件中,将所有两个或更多类似的相邻数字打包,例如

in_values = 28, 30, 45, 28, 28, 40, 40, 40, 45, 678, 567, 555, 555, 555, 555, 
6, 8, 23, 34, 34, 90

expected output = 28, 30, 45, 28:2, 40:3, 45, 678, 567, 555:4, 6, 8, 23, 34:2, 90

我尝试使用for&while循环来执行此操作,但不知道如何跳过for循环中的多个/重复项。你知道吗

def packValues(ints):
    L = []
    for i in range (len(ints)-1):
        if not ints[i] == ints[i+1]:
            L.append(ints[i])
            continue
        c = 1
        while ints[i] == ints[i+1]:
            c += 1
            i += 1
        L.append(str(ints[i]) + ':' + str(c))
    print(L)
in_values = 28, 30, 45, 28, 28, 40, 40, 40, 45, 678, 567, 555, 555, 555, 555, 6, 8, 23

packValues(in_values)

输出(不正确!)是:

[28, 30, 45, '28:2', 28, '40:3', '40:2', 40, 45, 678, 567, '555:4', '555:3', '555:2', 555, 6, 8]

Tags: 文件in列表foroutput数字expectedvalues
3条回答
in_values = [28, 30, 45, 28, 28, 40, 40, 40, 45, 678, 567, 555, 555, 555, 555, 6, 8, 23,40,40]
streak_count = []
counter = 1
for i in range(len(in_values)):
    if i != (len(in_values) - 1):
        if in_values[i+1] == in_values[i]:
            counter += 1
        else:
            streak_count.append( "{}:{}".format(in_values[i],counter) if counter > 1 else in_values[i] )
            counter = 1
    else:
        streak_count.append("{}:{}".format(in_values[i], counter) if counter > 1 else in_values[i])

print (streak_count)

输出:

[28, 30, 45, '28:2', '40:3', 45, 678, 567, '555:4', 6, 8, 23, '40:2']

如果上一个值包含在下面,则可以使用检查:

def packValues(ints):
    L = []
    prevVal=None
    for i in range (len(ints)-1):
        if ints[i] == prevVal:
            continue;
        if not ints[i] == ints[i+1]:
            prevVal=ints[i];
            L.append(ints[i])
            continue
        c = 1
        while ints[i] == ints[i+1]:
            c += 1
            i += 1
        L.append(str(ints[i]) + ':' + str(c))
        prevVal=ints[i];
    print(L)
in_values = 28, 30, 45, 28, 28, 40, 40, 40, 45, 678, 567, 555, 555, 555, 555, 6, 8, 23

packValues(in_values)

这里的代码片段将生成预期的输出。我刚刚在if语句中添加了一个else块,并删除了while块。你知道吗

def packValues(ints):
    L = []
    c = 1
    for i in range (len(ints)-1):
        if not ints[i] == ints[i+1]:
          if c > 1:
            L.append(str(ints[i]) + ':' + str(c))
            c = 1
          else:
            L.append(ints[i])
        else:
          c = c + 1
    L.append(ints[-1])
    print(L)
in_values = [28, 30, 45, 28, 28, 40, 40, 40, 45, 678, 567, 555, 555, 555, 555, 6, 8, 23]

packValues(in_values)

输出:

[28, 30, 45, '28:2', '40:3', 45, 678, 567, '555:4', 6, 8, 23]

编辑: 这也将考虑最近相邻的值。你知道吗

def packValues(ints):
    L = []
    c = 1
    for i in range (len(ints)-1):
      if ints[i] == ints[i+1]:
        c = c + 1
        continue
      if c > 1:
        L.append(str(ints[i]) + ':' + str(c))
        c = 1
      else:
        L.append(ints[i])
    if c > 1:
      L.append(str(ints[-1]) + ':' + str(c))
    else:
      L.append(ints[-1])
    return L

in_values = [28, 30, 45, 28, 28, 40, 40, 40, 45, 678, 567, 555, 555, 555, 555, 6, 8, 23]
print(packValues(in_values))
in_values = [28, 30, 555, 555, 555, 6, 8, 23, 40, 40]
print(packValues(in_values))

输出:

[28, 30, 45, '28:2', '40:3', 45, 678, 567, '555:4', 6, 8, 23]
[28, 30, '555:3', 6, 8, 23, '40:2']

相关问题 更多 >