【问题标题】:TypeError: 'tuple' object does not support item assignment On non tuple objectTypeError:“元组”对象不支持非元组对象上的项目分配
【发布时间】:2019-05-28 11:13:18
【问题描述】:

此代码采用 有序(从最高分到最低分)的元组列表,并收集最高分、第二高分和第三高分者的姓名和分数。如果他们打成平手,则两个名字都将附加到同一个列表中。

myresults=[('Raven', '18'), ('Cobra', '8'), ('Lion', '6'), ('Otter', '2')]


FirstScore=myresults[0][1]
SecondHighestScore=0
ThirdHighestScore=0
for i in myresults:
    if i[1]==FirstScore:
        FirstPlacePatrols.append(i[0])
for i in myresults:
    print(i[1])
    print(repr(i[1]))
    if int(i[1])<int(FirstScore):
        if int(i[1])>=SecondHighestScore:
            print(i[1])
            i[1]=SecondHighestScore
            SecondPlacePatrols.append(i[0])
for i in myresults:
    if int(i[1])<SecondHighestScore:
        if int(i[1])>=ThirdHighestScore:
            i[0]=ThirdHighestScore
            ThirdPlacePatrols.append(i[0])
print(FirstPlacePatrols)
print(FirstScore)
print(SecondPlacePatrols)
print(SecondHighestScore)
print(ThirdPlacePatrols)
print(ThirdHighestScore)

然而,

i[1]=SecondHighestScore

产量,

TypeError: 'tuple' object does not support item assignment

尽管如此,

print(repr(i[1]))

产量,

'18'

这显然不是元组。

【问题讨论】:

  • 您能给我们提供运行此代码所需的变量吗?
  • i 是这里的元组。与列表不同,您不能修改元组的元素;它们是不可变的。这似乎是一个类似的问题,我已经回答过。也许这会有所帮助:stackoverflow.com/a/53989234/8472377
  • 正如前面的评论所暗示的,i[1] 不是元组,但i 是。分配给i[1] 是尝试更改元组i,这是不允许的。
  • 你能添加一些预期的输出吗?

标签: python python-3.x list sorting tuples


【解决方案1】:

您无法更改tuple()s - 它们是不可变的。你可以创建一个新的。或者您可以使用itertools.groupby 将您的元组组合在一起并进行一些选择性输出:

myresults=[('Raven', '18'), ('Cobra', '8'), ('Lion', '6'), ('Swine', '6'), ('Otter', '2')]

from itertools import groupby

grped = groupby(myresults, lambda x: int(x[1])) 

# create a dict for all results
result_dict = {}
for key in grped :
    result_dict[key[0]] = [value for value,_ in key[1]] 

# print top 3 results:
for k in sorted(result_dict,reverse=True):
    print(k)
    print(result_dict[k])

# whole dict
print(result_dict)

输出:

18
['Raven']
8
['Cobra']
6
['Lion', 'Swine']

# whole dict
{18: ['Raven'], 8: ['Cobra'], 6: ['Lion', 'Swine'], 2: ['Otter']}            

第二种方法是使用collections.defaultdict

myresults=[('Raven', '18'), ('Cobra', '8'), ('Lion', '6'), ('Swine', '6'), ('Otter', '2')]

from collections import defaultdict

result_dict = defaultdict(list)

for value,key in myresults:
    result_dict[int(key)].append(value)

for k in sorted(result_dict,reverse=True):
    print(k)
    print(result_dict[k])

print(result_dict)


18
['Raven']
8
['Cobra']
6
['Lion', 'Swine']
2
['Otter']

# whole dict
defaultdict(<class 'list'>, {18: ['Raven'], 8: ['Cobra'], 
                              6: ['Lion', 'Swine'], 2: ['Otter']})

独库:

【讨论】:

    【解决方案2】:

    这是我的解决方案:

    from collections import defaultdict
    given_list = [('Raven', '18'), ('Cobra', '8'), ('Lion', '6'), ('Python', '6'),('Otter', '2')]
    reversed_dict = defaultdict(list)
    for key,value in given_list:
        reversed_dict[int(value)].append(key)
    
    for k in reversed(sorted(reversed_dict)[-3:]):
         print(k,reversed_dict[k])
    

    输出:

    18 ['Raven']
    8 ['Cobra']
    6 ['Lion', 'Python']
    

    【讨论】:

      猜你喜欢
      • 2015-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-31
      • 2014-02-18
      • 2017-03-26
      • 2021-08-05
      相关资源
      最近更新 更多