【问题标题】:Append a number to duplicate values in a list - python附加一个数字以重复列表中的值 - python
【发布时间】:2021-07-22 01:36:36
【问题描述】:
   devices = [
    'SWTEST1-3AA-02',
    'SWTEST1-3AA-02',
    'SWTEST1-2CA-01',
    'SWTEST1-2CA-01',
    'SWTEST1-2AA-02',
    'SWTEST1-2AA-02',
    'SWTEST1-2AA-02'
  ]

我正在寻找的输出如下。

[
'SWTEST1-3AA-02',
'SWTEST1-3AA-02-2',
'SWTEST1-2CA-01',
'SWTEST1-2CA-01-2',
'SWTEST1-2AA-02',
'SWTEST1-2AA-02-2',
'SWTEST1-2AA-02-3'
]

我尝试使用 for 循环和计数器,但没有得到我想要的结果,我们将不胜感激。

对于我尝试过的循环:

counter = 1
out = []
for e in devices:
    out.append(f"{e}-{counter}")
    counter += 1
print(out)
out = []

d = {}

for i in devices:
    counter = 1
    d.setdefault(i, -1)
    d[i] += 1

    if d[i] >= 1:
        out.append('{}-{}'.format(i, d[i]))
        counter += 1
    else:
        out.append(i)

print(out)

【问题讨论】:

标签: python list duplicates


【解决方案1】:

这应该做你想做的:

from collections import Counter

result = [(t+(f'-{i+1}' if i>0 else '')) for t,count in Counter(devices).items() for i in range(count)]

但是,如果订购很重要,这将不起作用,您可能需要更多的参与。 (我的意思是最终输出将有重复的值组合在一起,而不是按照它们在原始列表中出现的顺序)

如果你想维护订单,你想要这样的东西:

def number_duplicates(values):
    counter = Counter()

    for v in values:
        counter[v] += 1
        if counter[v]>1:
            yield v+f'-{counter[v]}'
        else:
            yield v

result = list(number_duplicates(devices))

现在结果将具有与原始值相同的顺序,但附加了重复的计数器。

【讨论】:

    【解决方案2】:

    如果您不关心保留列表的原始顺序,则可以使用类似这样的方法(并且很好且简单,并且可以在线性时间内工作)

    counter = Counter(devices)
    result = []
    for value, count in counter.items():
        result.append(value)
        for i in range(2, count+1): 
            result.append("{}-{}".format(value, i))
    

    【讨论】:

      【解决方案3】:

      另一种解决方案:

      devices = [
          "SWTEST1-3AA-02",
          "SWTEST1-3AA-02",
          "SWTEST1-2CA-01",
          "SWTEST1-2CA-01",
          "SWTEST1-2AA-02",
          "SWTEST1-2AA-02",
          "SWTEST1-2AA-02",
      ]
      
      out, cnt = [], {}
      for d in devices:
          if d not in cnt:
              cnt[d] = 1
          else:
              cnt[d] += 1
              d = d + "-{}".format(cnt[d])
          out.append(d)
      
      print(out)
      

      打印:

      ['SWTEST1-3AA-02', 
       'SWTEST1-3AA-02-2', 
       'SWTEST1-2CA-01', 
       'SWTEST1-2CA-01-2', 
       'SWTEST1-2AA-02', 
       'SWTEST1-2AA-02-2', 
       'SWTEST1-2AA-02-3']
      

      【讨论】:

      • 这是我尝试编写的类似代码,看起来我做错了几步,谢谢!
      【解决方案4】:

      您可以使用列表推导:

      devices = ['SWTEST1-3AA-02', 'SWTEST1-3AA-02', 'SWTEST1-2CA-01', 'SWTEST1-2CA-01', 'SWTEST1-2AA-02', 'SWTEST1-2AA-02', 'SWTEST1-2AA-02']
      r = [a if not (s:=sum(j == a for j in devices[:i])) else f'{a}-{s+1}'
          for i, a in enumerate(devices)]
      

      输出:

      ['SWTEST1-3AA-02', 
       'SWTEST1-3AA-02-2', 
       'SWTEST1-2CA-01', 
       'SWTEST1-2CA-01-2', 
       'SWTEST1-2AA-02', 
       'SWTEST1-2AA-02-2', 
       'SWTEST1-2AA-02-3']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-15
        • 1970-01-01
        • 2014-12-09
        • 1970-01-01
        • 2013-06-18
        • 1970-01-01
        • 1970-01-01
        • 2019-03-16
        相关资源
        最近更新 更多