使用字典进行字符串压缩

时间:2019-04-01 10:54:08

标签: python python-3.x

代码:

'''
Program to Compress a string using Dictonaries.

Input samle--> 'AAAABBBBCCCCDDDDaa'
output sample--> 'A4B4C4D4a2'

'''
# Function declaration
def string_compression(str):
    d = {}
    x = []

    # Generating Key-Value pair for entire string
    for i in str:
        if i not in d.keys():
            d[i] = 1
        else:
            d[i] = d[i] + 1

    # Copying Key Value Pairs in a list
    for key,value in d.items():
        x.append(key)
        x.append(value)

    # Printing a Cocktail list of Strings and Integers
    print(x)

    # Converting Integers in list x to Strings and Joining them
    for i in x[1::2]:
        x[i] = str(x[i])
    print(''.join(x))
    #print(''.join(map(str, x)))



y = 'AAAABBBBCCCCDDDDaa'
string_compression(y) # Function Call

输出:

['A', 4, 'B', 4, 'C', 4, 'D', 4, 'a', 2]

Traceback (most recent call last):
  File "string_compression.py", line 36, in <module>
    string_compression(y) # Function Call
  File "string_compression.py", line 30, in string_compression
    x[i] = str(x[i])
TypeError: 'str' object is not callable

我可以将x打印为列表, 但是我无法以字符串格式打印列表。

我还按照我以前的文章尝试了所有可能的解决方案组合: Converting list of Integers and Strings to purely a string

但是只有当我尝试在仅使用两行代码的新文件中运行代码时,链接的解决方案才有效:

x = ['A', 4, 'B', 4, 'C', 4, 'D', 4, 'a', 2] print(''.join(map(str, x)))

为什么在以上这段代码中,任何方法都不起作用?有什么我落后的概念吗?

3 个答案:

答案 0 :(得分:1)

将参数从内置关键字类型str更改为其他内容,也许是s,并在加入时也切换到map

def string_compression(s):
    d = {}
    x = []

    # Generating Key-Value pair for entire string
    for i in s:
        if i not in d.keys():
            d[i] = 1
        else:
            d[i] = d[i] + 1

    # Copying Key Value Pairs in a list
    for key,value in d.items():
        x.append(key)
        x.append(value)

    # Printing a Cocktail list of Strings and Integers
    print(x)

    # Converting Integers in list x to Strings and Joining them
    for i in x[1::2]:
        x[i] = str(x[i])
    print(''.join(map(str, x)))



y = 'AAAABBBBCCCCDDDDaa'
string_compression(y) # Function Call

输出

['A', 4, 'B', 4, 'C', 4, 'D', 4, 'a', 2]
A4B4C4D4a2

答案 1 :(得分:0)

您的特定问题是您在函数的参数中使用名称str,这掩盖了您要调用的内置str()函数。

但是,您的算法中也存在一些错误-字典没有排序(无论如何都不是在Python 3.6之前),因此不能保证您会得到相同顺序的字符。另外,如果输入字符串为aaaaabbbbbaaaaa,则您将得到类似a10b5的内容,它对aaaaaabbbbbaaaaa是不可逆的。 (我不会讨论如何使用数字字符串不可逆地“压缩”,但这也是一个问题。)

我会做这样的事情:

def string_rle(s):
    parts = []
    for c in s:
        if not parts or c != parts[-1][0]:
            parts.append([c, 1])
        else:
            parts[-1][-1] += 1
    return ''.join('%s%d' % (part[0], part[1]) for part in parts)

print(string_rle('AAAABBBBCCCCDDDDaa'))

这个想法是parts包含一个字符对和一个计数对的有序列表,对于原始字符串中的每个字符,我们看一下当前对(parts[-1])是否具有相同的对字符;如果是这样,我们将增加计数器,否则,将生成一个新的对。

答案 2 :(得分:0)

您已经在函数定义中覆盖了'str'函数作为函数参数:

def string_compression(str): # your argument overrides the 'str' function

因此,当您尝试在此处调用“ str”函数时:

x[i] = str(x[i])

您实际上正在调用“ string_compression”参数,该参数不可调用。

将变量“ str”的名称更改为其他名称。

顺便说一句,这是for循环:

for i in x[1::2]:
    x[i] = str(x[i])

生成的列表[C,a,C,C,C]不是您要的列表。您需要获取整数索引,而不是整数本身。

for i in range(1,len(x),2):
    print str(x[i])
相关问题