将关键字附加到字典(Python)

时间:2018-08-09 03:26:19

标签: python dictionary append

我尝试更新字典中的键。我使用.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))

2 个答案:

答案 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]})

由于我无法弄清楚您的代码打算做什么,所以我不知道您想要哪个修复程序。但是我确实知道,如果您想appendfinal中的值,则这些值必须是(字符串的)列表,而不是字符串。


同时,这行代码由于没有明显的原因而过于复杂:

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键的笛卡尔正方形上的嵌套循环是做什么的,或者所有这些临时对象的用途是什么,因此很难说如何解决它们,但是您很难可以摆脱它们,所以您没有对其进行修复。