如何通过列表递增并用其计数替换某些值

时间:2019-03-26 02:46:30

标签: python

我正在尝试增加一个列表,并将给定值的多次出现(按顺序)替换为出现的次数(作为粗略范围,出现1-3的较小,出现4-6的发生中等,并且超过6次是很大的次数。

我正在尝试找到一种解决此问题的优雅方法,并希望获得任何指导。我浏览了itertools,但找不到适合的东西(我认为)。

任何帮助将不胜感激。谢谢

例如:

testList = [1、2、2、1、1、2、1、4、1、2、2、2、2、2、1、2、2、2、2、2、2、2, 2、2、1]

将成为

[1,“ 2次小次数”,1、1,“ 2次小次数”,1、4、1,“ 2次中等次数”,1,“ 2次大次数”]]

testList = [1, 2, 2, 1, 1, 2, 1, 4, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1]

listLocation = -1

newlist = []

for i in testList:

    listLocation += 1

    if i == 2:

        if testList[listLocation+1] == 2:

            testList[listLocation] = "2 multiple"

            newlist.append(testList[listLocation])

            testList.pop(listLocation+1)

    else:
        newlist.append(i)

newlist

据我所知,现在它只是检测2个序列中多次出现,并用字符串替换该序列,但是我不知道如何将其从实际的计数器移到按范围和更优雅的代码样式对其进行分类(我敢肯定有一种方法可以避免使用listLocation变量来跟踪列表索引)。另外,我也无法解决如何检测列表结尾的问题,因为现在如果列表中的最后一个值达到2,就会崩溃。

任何帮助将不胜感激,谢谢

3 个答案:

答案 0 :(得分:1)

我认为这是一种简单的方法。

a = [1, 2, 2, 1, 1, 2, 1, 4, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1]
b = []
i=0
while  i<len(a) and i < len(a):
    if a[i]==2:
        n=i
        while a[i]==2:
            i+=1

        if (i-n)<4:
            b.append("2 small amount of times")
        elif (i-n)<6 and (i-n)>4:
            b.append("2 medium amount of times")
        else:
            b.append("2 large amount of times")                                                                                                                

    else:
        b.append(a[i])
        i+=1
print(b)

输出:

[1, '2 small amount of times', 1, 1, '2 small amount of times', 1, 4, 1, '2 large amount of times', 1, '2 large amount of times', 1]

如果您有任何疑问,请告诉我。

答案 1 :(得分:0)

这是我的解决方案。首先,让我们定义一个函数,该函数返回要插入列表中的消息:

def message(value, count):
    msg = '{value} {amount} amount of times'

    if 1 <= count <= 3:
        msg = msg.format(value=value, amount='small')
    elif 4 <= count <= 6:
        msg = msg.format(value=value, amount='medium')
    else:
        msg = msg.format(value=value, amount='large')

    return msg

第二,我们定义一个函数,该函数需要一个值列表和一个要计为其参数的值:

def counter(values, value):
    count = 0
    results = []

    for i, v in enumerate(values):

        if v != value:

            if count:
                results.append(message(value, count))
                count = 0

            results.append(v)
            continue

        count = count + 1

        if i < len(values) - 1:
            continue

        results.append(message(value, count))

    return results

这是结果:

>>> values = [1, 2, 2, 1, 1, 2, 1, 4, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1]
>>> counter(values, value=2)
[1,
 '2 small amount of times',
 1,
 1,
 '2 small amount of times',
 1,
 4,
 1,
 '2 medium amount of times',
 1,
 '2 large amount of times',
 1]

答案 2 :(得分:0)

如果要对列表中的所有数字进行分组,可以先创建一个列表列表,然后将其重新分组。

首先创建一个具有相同编号的列表:

def group_list(input_list):
    l,s = [], 0
    for i in range(len(input_list)):
        try:
            if input_list[i] != input_list[i+1]:
                l.append(input_list[s:i+1])
                s=i+1
        except IndexError:
            if input_list[i] == input_list[i-1]:
                l.append(input_list[s:i+1])
            else:
                l.append([input_list[i]])
    return l

然后应用金额消息:

def message(num):
    if num > 6:
        return 'large'
    elif num >4:
        return 'medium'
    else:
        return 'small'

两个功能都准备就绪后,进行列表理解。

another_list = [i[0] if len(i)<2 else f"{i[0]} {message(len(i))} amount of times" for i in group_list(testList)]

print (another_list)

结果:

[1, '2 small amount of times', '1 small amount of times', 2, 1, '4 small amount of times', 1, '2 medium amount of times', 1, '2 large amount of times', 1]