我尝试更新字典中的键。我使用.aapend()
方法,但出现以下错误:
AttributeError: 'str' object has no attribute 'append'
代码如下:
class FileOwners:
@staticmethod
def group_by_owners(files):
fileName=[]
tempName=[]
final={}
for i in files:
for j in files:
if files.get(j) not in tempName:
tempName.append(files.get(j))
fileName.append(i)
final.update({files.get(j):i})
break
else:
final.setdefault(files.get(j), []).append(i)
return final
files = {
'Input.txt': 'Randy',
'Code.py': 'Stan',
'Output.txt': 'Randy'
}
print(FileOwners.group_by_owners(files))
答案 0 :(得分:1)
错误与final.setdefault(files.get(j), []).append(i)
.setdefault是获取j值(如果可能)并返回它。由于j的值为Input.txt
,它将返回'Randy'
,它是一个字符串,没有附加函数
此外,您不能将列表作为字典中的键,因此该行将始终中断。
答案 1 :(得分:1)
首先,是的,字符串没有append
方法。您可以查看所有方法in the docs的列表,或者通过在交互式解释器中输入help(str)
甚至只是打印出dir(str)
来查看。
字符串没有append
方法的原因是它们是不可变的-您不能更改字符串值。您只能创建一个全新的字符串值,例如,将两个字符串加在一起:
>>> 'abc' + 'def'
'abcdef'
但是,您仍然可以对具有字符串值的变量或其他目标使用增强分配:
>>> s = 'abc'
>>> s += 'def'
'abcdef'
这不会更改值'abc'
,而是产生一个全新的'abcdef'
值并将其分配给s
。但这对你很好。
因此,如果要更新字符串形式的dict值,可以执行以下操作:
>>> d = {'abc': 'def'}
>>> d['abc'] += 'ghi'
>>> d
{'abc': 'defghi'}
但是,实际上,您似乎根本不想添加到字符串。您想要的是一个字典,其中包含值的字符串列表。
因此,首先以这种方式创建它:
files = {
'Input.txt': ['Randy'],
'Code.py': ['Stan'],
'Output.txt': ['Randy']
}
…,现在您的其余代码将可用。
或者,也许您希望files
是具有(单个)字符串值的字典,而仅final
是具有字符串值列表的字典。在这种情况下,请执行以下操作:
final.update({files.get(j):i})
…执行此操作:
final.update({files.get(j): [i]})
由于我无法弄清楚您的代码打算做什么,所以我不知道您想要哪个修复程序。但是我确实知道,如果您想append
到final
中的值,则这些值必须是(字符串的)列表,而不是字符串。
同时,这行代码由于没有明显的原因而过于复杂:
final.update({files.get(j):i})
如果您只想替换字典中的值,只需为其赋值:
final[files.get(j)] = i
或者,因为您似乎希望j
始终位于files
中,所以为什么还要使用get
?
final[files[j]] = i
最后,您至少还有一个其他主要问题:使用来自所有列表的files
中的值解决了该问题之后,您尝试将这些值用作final
中的键。但是列表不能用作字典键。
原因再次回到可变性。假设您这样做:
lst = [1]
d = {lst: 3}
lst.append(2)
现在,即使d[[1]]
了,[1] != lst
仍应找到该值吗?也许d[[1, 2]]
应该找到该值,即使dict哈希为[1]
呢?真的,没有选择是有意义的。这就是为什么Python中的可变类型要么不可哈希,要么在哈希和比较函数中不考虑其可变值。
想必您实际上是在尝试将列表仅用作“某种顺序”;当列表发生突变时,您不希望final
进行任何更改。
如果是这样,则可以将具有相同值的元组用作键:
final[tuple(files[j])] = i
但是,毕竟,看来您真正想做的事情要简单得多:
groups = {}
for file, owner in files.items():
groups.setdefault(owner, []).append(file)
我不确定files
键的笛卡尔正方形上的嵌套循环是做什么的,或者所有这些临时对象的用途是什么,因此很难说如何解决它们,但是您很难可以摆脱它们,所以您没有对其进行修复。