此代码比较(i)第(i)项和第(i + 1)项的标识符是否相同,是否需要用竖线字符替换换行符。
string=""
for i in range(0,len(arrangedList)-1):
if arrangedList[i][0]==arrangedList[i+1][0]:
string = arrangedList[i][1][1]
if "\n" in string:
string.replace("\n","|")
arrangedList[i][1][1]=string
但是,它会返回错误:
TypeError:'tuple'对象不支持项目分配
我无法跟随我将其转换为元组而不是列表。
文件格式如下:
[0, ('Filename', './root/lib/\n')]
[0, ('Description', 'Socket\n')]
[0, ('ListenStream', 'someSocket\n')]
[0, ('SocketMode', 'someNumber\n')]
[0, ('Service', 'someService\n')]
[1, ('Filename', './root/lib/\n')]
[1, ('Description', 'Socket\n')]
[1, ('ListenStream', 'someSocket\n')]
所需的格式为:
[0, ('Filename', './root/lib/|')]
[0, ('Description', 'Socket|')]
[0, ('ListenStream', 'someSocket|')]
[0, ('SocketMode', 'someNumber|')]
[0, ('Service', 'someService\n|']
[1, ('Filename', './root/lib/|')]
[1, ('Description', 'Socket|')]
[1, ('ListenStream', 'someSocket|')]
而不是一些换行符,有'|'现在的角色。
P.S。经过一些后期格式化后,它将用于降价表。
答案 0 :(得分:2)
这意味着它所说的,tuple
是不可变的,这意味着你无法改变它们内部的值,如果你想要一个不同的值,你必须创建一个新的。
问题出在arrangedList[i][1][1]=string
。
一个简单的解决方法:arrangedList[i][1]=(arrangedList[i][1][0], string)
。
(您可以指定arrangedList[i][1]
,因为它是list
,而不是tuple
)
答案 1 :(得分:1)
正确地提到元组是不可变对象。因此,如果您的输入数据是元组形式,则需要将其转换为例如列表,然后对数据进行更改。试试这个:
arrangedList = [[0, ('Filename', './root/lib/\n')],
[0, ('Description', 'Socket\n')],
[0, ('ListenStream', 'someSocket\n')],
[0, ('SocketMode', 'someNumber\n')],
[0, ('Service', 'someService\n')],
[1, ('Filename', './root/lib/\n')],
[1, ('Description', 'Socket\n')],
[1, ('ListenStream', 'someSocket\n')]]
# Convert the tuples to lists
for item in arrangedList:
item[1] = list(item[1])
string=""
for i in range(0,len(arrangedList)-1):
if arrangedList[i][0]==arrangedList[i+1][0]:
# string = arrangedList[i][1][1]
print('STRING: ', string)
string = arrangedList[i][1][1]
if "\n" in string:
string = string.replace("\n","|")
arrangedList[i][1][1]=string
print(arrangedList)
另请注意,replace
方法返回包含更改的原始字符串的副本。它不会更改原始字符串。
还有一件事 - 您的输出应该与Filename', './root/lib/|
类似,但不像'Filename', './root/lib/'|
。管道标志必须在字符串内部。