【问题标题】:Convert array of letters into their counts with Python使用 Python 将字母数组转换为计数
【发布时间】:2022-01-17 01:47:27
【问题描述】:

我有一个数组,例如 [A,A,A,B,B,C,A,A,D,D,D,B]

我想计算条目并将其转换为 [3A,2B,1C,2A,3D,1B]

我尝试了很多 if else 类型的逻辑,但我遇到了问题。有没有一种巧妙的方法可以做到这一点?

【问题讨论】:

  • 你说你有问题,你有什么问题?您是否有一些可以显示的入门代码,以便我看看您已经完成了多远?
  • 它变成了一堆 if else 语句,我知道会有更好的方法。明天我将尝试一些答案。感谢您的回复。

标签: python arrays count


【解决方案1】:

似乎很好地使用了itertools.groupby

from itertools import groupby

l = ['A','A','A','B','B','C','A','A','D','D','D','B']

[f'{len(list(g))}{k}' for k, g in groupby(l)]
# ['3A', '2B', '1C', '2A', '3D', '1B']

【讨论】:

  • [list(g) for k,g in list(groupby(l))] 给出空列表并从groupby(l) 中删除list() 效果很好,为什么会这样?
  • @Bibhav 带有 groupby 的组都绑定到单个迭代器,因此调用 list(groupby(l)) 会用完组的迭代器。文档中对此进行了解释:“由于源是共享的,因此当 groupby() 对象高级时,前一个组不再可见。因此,如果以后需要该数据,则应将其存储为列表”。这使它能够有效地处理大型迭代器。
  • 谢谢,这完美地解决了我的需求。我试图投票,但我首先需要更多的声望,我会继续努力的!
【解决方案2】:

这是解决此问题的一种方法。

letters = ['A', 'A', 'A', 'B', 'B', 'C', 'A', 'A', 'D', 'D', 'D']

previous_letter = letters[0]
counter = 1
res = list()
for i in range(1, len(letters)):
    current_letter = letters[i]
    if current_letter == previous_letter:
        counter += 1

    else:
        res.append(f"{counter}{current_letter}")
        previous_letter = letters[i]
        counter = 1

res.append(f"{counter}{previous_letter}")
print(res)

诀窍在于检查字母的变化并跟踪计数。

【讨论】:

  • 您好,感谢您的回复。这是我正在尝试的,但我希望有一个更简单的解决方案。我在上面找到了一个。
【解决方案3】:

您可以尝试使用 list.count() 获取第一项出现的次数,然后在 for 循环中使用 list.pop(list.index()) 删除第一项的所有出现,在 while 循环中执行此操作直到 len(lst) 返回 0

out = []
while len(lst) > 0:
    s = lst[0]
    c = 0
    while len(lst) > 0:
        if lst[0] == s:
            c += 1
            lst.pop(0)
    out.append(f"{c}{s}")

【讨论】:

  • 似乎这会产生['5A', '3B', '1C', '3D'] 与海报的输入,但他们想要[3A,2B,1C,2A,3D,1B]
  • @Mark 感谢您的评论,我没有正确阅读问题我将编辑我的答案
猜你喜欢
  • 2015-01-24
  • 2014-06-05
  • 1970-01-01
  • 2021-05-30
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-07
相关资源
最近更新 更多