代码:
'''
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)))
为什么在以上这段代码中,任何方法都不起作用?有什么我落后的概念吗?
答案 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])