【问题标题】:Count the number of times values appear next to eachother计算值彼此相邻出现的次数
【发布时间】:2019-09-29 11:36:30
【问题描述】:

我有一个看起来像这样的列表:

['C', 'C', 'H', 'H', 'E', 'H', 'C', 'C', 'C', 'H', 'H', 'C', 'H', 'H', 'H', 'H', 'C']

我希望能够计算一个、两个或三个 H 彼此相邻出现的次数,但不超过此次数。

所以上例中,HHH出现0次,HH出现2次,H出现1次。

我尝试构建一个循环遍历当前和先前位置的 for 循环,但我觉得这太啰嗦了。

【问题讨论】:

  • 三个“H”怎么样?
  • 这实际上更令人困惑 :(。4 Hs 不也等于 2-2Hs 吗?

标签: python list counting


【解决方案1】:

你可以这样做,使用defaultdictgroupby

from collections import defaultdict
from itertools import groupby

lst = ['C', 'C', 'H', 'H', 'E', 'H', 'C', 'C', 'C', 'H', 'H', 'C', 'H', 'H', 'H', 'H', 'C']

counts = defaultdict(int)
for _, group in groupby(lst):
    s = ''.join(group)
    if len(s) < 4:
        counts[s] += 1

print(counts)

输出

{'CC': 1, 'HH': 2, 'E': 1, 'H': 1, 'CCC': 1, 'C': 2}

这个想法是用 groupby 找到 run 的连续字母并将计数存储在字典中,在本例中为 defaultdict。

【讨论】:

  • 这是一个很好的答案,非常整洁,谢谢。有没有办法找出H的原始位置?即唯一的 H,它最初在序列中的什么位置.. 我尝试添加 count = 0 然后 counter = counter+1 并在 if 语句之后打印它,这是正确的做法吗?
  • 你也可以索引,但是你需要所有孤独的H的位置吗?
  • 是的,所以例如,在这种情况下,位置 6 有一个单独的 H,有没有办法得到这个信息?
  • 别担心,我想通了!再次感谢您!
【解决方案2】:

可能是这样的?它打印所有相邻的数字 H。

X = ['C', 'C', 'H', 'H', 'E', 'H', 'C', 'C', 'C', 'H', 'H', 'C', 'H', 'H', 'H', 'H', 'C']
from collections import Counter
def cnt(X,c):
    i = 0
    count = Counter()
    temp = 0 #temporary variable to store counter
    while i < len(X):
        if X[i] != c:
            i += 1
        else:
            while i < len(X) and X[i] == c: #keep looping until end of array or different character
                temp += 1
                i += 1
            count[temp] += 1
            temp = 0
    print(count)
cnt(X,'H')

#Counter({2: 2, 1: 1, 4: 1})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-12
    • 2019-07-10
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多