Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的字典操作列表-TypeError:unhabable type:';dict';_Python - Fatal编程技术网

python中的字典操作列表-TypeError:unhabable type:';dict';

python中的字典操作列表-TypeError:unhabable type:';dict';,python,Python,我有以下表格的列表: oldlist = [{'x': {'a':1,'b':2}, 'y':2},{'x':{'a':6,'b':7}, 'y':2},{'x':{'a':1,'b':2}, 'y':3},{'x':{'a':1,'b':2}, 'y':2},{'x':{'a':10,'b':11}, 'y':4}] 转化为 final = [{'x':{'a':1,'b':2},'y':[2,3,2],'count':3},{'x':{'a':6,'b':7},'y':[2],'cou

我有以下表格的列表:

oldlist = [{'x': {'a':1,'b':2}, 'y':2},{'x':{'a':6,'b':7}, 'y':2},{'x':{'a':1,'b':2}, 'y':3},{'x':{'a':1,'b':2}, 'y':2},{'x':{'a':10,'b':11}, 'y':4}]  
转化为

final = [{'x':{'a':1,'b':2},'y':[2,3,2],'count':3},{'x':{'a':6,'b':7},'y':[2],'count':1},{'x':{'a':10,'b':11},'y':[4],'count':1}]  
我试过了

oldlist = [{'x': {'a':1,'b':2}, 'y':2},{'x':{'a':6,'b':7}, 'y':2},{'x':{'a':1,'b':2}, 'y':3},{'x':{'a':1,'b':2}, 'y':2},{'x':{'a':10,'b':11}, 'y':4}]  
list1=[]  
list2=[]  
list3=[]  
s = set([d['x'] for d in oldlist])  
news=list(s)  
for item in oldlist:  
if item['x'] == news[0]:  
      list1.append(item['y'])  

if item['x'] == news[1]:  
      list2.append(item['y'])  

if item['x'] == news[2]:  
      list3.append(item['y'])  
final=[]  
dic1 = {'x':news[0],'y':list1,'count':len(list1)}  
dic2 = {'x':news[1],'y':list2,'count':len(list2)}  
dic3 = {'x':news[2],'y':list3,'count':len(list3)}  
final.append(dic1)  
final.append(dic2)  
final.append(dic3)  
print final
得到

s=设置([d['x']表示旧列表中的d])
TypeError:无法损坏的类型:“dict”

有没有更简单的方法?另外,我知道x只能有三个值,所以我创建了三个变量list1、list2和list3。如果x可以有几个其他的值,我必须找到一个类似的字典列表,比如final!它也应该适用于字符串

编辑:我试过这个。但一切都搞砸了

s = list(frozenset(oldlist[0]['x'].items()))  
print s  
for item in oldlist:  
    s.append(frozenset(item['x'].items()))  

set函数只能处理可哈希的对象,如字符串、数字、元组e.t.c

List、dict等数据类型是不可损坏的类型,因此set函数无法处理它们

为了更清楚一些:

您需要的基本实现:

for elem in oldlist:
    found = False
    for item in newlist:
        if elem['x'] == item['x']:
            y = item.get('y',[])
            item['y'] = t.append(elem['y'])
            found = True
            break
    if not found:
        newlist.append({'x':elem['x'], 'y':[elem['y']]})

这将为您提供预期的结果

set函数只能处理可哈希的对象,如字符串、数字、元组e.t.c

List、dict等数据类型是不可损坏的类型,因此set函数无法处理它们

为了更清楚一些:

您需要的基本实现:

for elem in oldlist:
    found = False
    for item in newlist:
        if elem['x'] == item['x']:
            y = item.get('y',[])
            item['y'] = t.append(elem['y'])
            found = True
            break
    if not found:
        newlist.append({'x':elem['x'], 'y':[elem['y']]})

这将为您提供预期的结果

python的Set函数不允许使用字典,您无法强制它,请尝试其他方法。(仔细查看第五行和第六行的评论)

请尝试以下代码:

oldlist = [{'x': {'a':1,'b':2}, 'y':2},{'x':{'a':6,'b':7}, 'y':2},{'x':{'a':1,'b':2}, 'y':3},{'x':{'a':1,'b':2}, 'y':2},{'x':{'a':10,'b':11}, 'y':4}]  
list1=[]  
list2=[]  
list3=[]  
s = [d['x'] for d in oldlist] # Placed the dictionaries in a list
s = result = [dict(tupleized) for tupleized in set(tuple(item.items()) for item in s)] # This is the manual way on removing duplicates dictionaries in a list instead of using set
news=list(s)  
for item in oldlist:  
    if item['x'] == news[0]:  
        list1.append(item['y'])  

    if item['x'] == news[1]:  
        list2.append(item['y'])  

    if item['x'] == news[2]:  
        list3.append(item['y']) 

final=[]  
dic1 = {'x':news[0],'y':list1,'count':len(list1)}  
dic2 = {'x':news[1],'y':list2,'count':len(list2)}  
dic3 = {'x':news[2],'y':list3,'count':len(list3)}  
final.append(dic1)  
final.append(dic2)  
final.append(dic3)  
print final

python的Set函数不允许使用字典,您不能强制使用,请尝试其他方法。(仔细查看第五行和第六行的评论)

请尝试以下代码:

oldlist = [{'x': {'a':1,'b':2}, 'y':2},{'x':{'a':6,'b':7}, 'y':2},{'x':{'a':1,'b':2}, 'y':3},{'x':{'a':1,'b':2}, 'y':2},{'x':{'a':10,'b':11}, 'y':4}]  
list1=[]  
list2=[]  
list3=[]  
s = [d['x'] for d in oldlist] # Placed the dictionaries in a list
s = result = [dict(tupleized) for tupleized in set(tuple(item.items()) for item in s)] # This is the manual way on removing duplicates dictionaries in a list instead of using set
news=list(s)  
for item in oldlist:  
    if item['x'] == news[0]:  
        list1.append(item['y'])  

    if item['x'] == news[1]:  
        list2.append(item['y'])  

    if item['x'] == news[2]:  
        list3.append(item['y']) 

final=[]  
dic1 = {'x':news[0],'y':list1,'count':len(list1)}  
dic2 = {'x':news[1],'y':list2,'count':len(list2)}  
dic3 = {'x':news[2],'y':list3,'count':len(list3)}  
final.append(dic1)  
final.append(dic2)  
final.append(dic3)  
print final
您可以使用where键,其中键是从原始dict中的
x
值创建的对象,值是相对
y
的列表。然后,您可以使用列表理解构建最终结果,并将
frozensets
返回到dicts:

from collections import defaultdict

oldlist = [{'x': {'a':1,'b':2}, 'y':2},{'x':{'a':6,'b':7}, 'y':2},{'x':{'a':1,'b':2}, 'y':3},{'x':{'a':1,'b':2}, 'y':2},{'x':{'a':10,'b':11}, 'y':4}]
res = defaultdict(list)
for d in oldlist:
    res[frozenset(d['x'].items())].append(d['y'])

final = [{'x': dict(k), 'y': v, 'count': len(v)} for k, v in res.items()] # [{'y': [2, 3, 2], 'x': {'a': 1, 'b': 2}, 'count': 3}, {'y': [4], 'x': {'a': 10, 'b': 11}, 'count': 1}, {'y': [2], 'x': {'a': 6, 'b': 7}, 'count': 1}]
您可以使用where键,其中键是从原始dict中的
x
值创建的对象,值是相对
y
的列表。然后,您可以使用列表理解构建最终结果,并将
frozensets
返回到dicts:

from collections import defaultdict

oldlist = [{'x': {'a':1,'b':2}, 'y':2},{'x':{'a':6,'b':7}, 'y':2},{'x':{'a':1,'b':2}, 'y':3},{'x':{'a':1,'b':2}, 'y':2},{'x':{'a':10,'b':11}, 'y':4}]
res = defaultdict(list)
for d in oldlist:
    res[frozenset(d['x'].items())].append(d['y'])

final = [{'x': dict(k), 'y': v, 'count': len(v)} for k, v in res.items()] # [{'y': [2, 3, 2], 'x': {'a': 1, 'b': 2}, 'count': 3}, {'y': [4], 'x': {'a': 10, 'b': 11}, 'count': 1}, {'y': [2], 'x': {'a': 6, 'b': 7}, 'count': 1}]


如果您可以共享抛出错误的行,这将非常有用。如果您可以共享抛出错误的行,这将非常有用。那么,我可以对代码进行哪些更改以使其正常工作?@glitterati:无法找出任何特定的算法。必须使用普通暴力方法“普通暴力方法”是什么?我的好像坏了!那么我可以对我的代码做些什么修改才能使其正常工作?@glitterati:我想不出任何具体的算法。必须使用普通暴力方法“普通暴力方法”是什么?我的好像坏了!谢谢!这是可行的,但我们知道,对于x,oldlist中只有三个disctinct值,因此我们可以分配list1 list2和List3。但如果这是一个意外的数字呢!你能提出一些建议吗?刚刚看到你的评论,请稍等,但你能投票支持我的答案吗?非常感谢!这是可行的,但我们知道,对于x,oldlist中只有三个disctinct值,因此我们可以分配list1 list2和List3。但如果这是一个意外的数字呢!你能提出一些建议吗?刚刚看到你的评论,等一下,但你能投票支持我的答案吗?谢谢,我知道这是要发布的@DeanChristianArmada:另一个选项是将dict中的项转换为元组中的元组,但由于dict是无序的,因此需要对它们进行排序<代码>{a':1,'b':2}.items()返回
[('a',1),('b',2)]
[('b',2),('a',1)]
,这也是一个很长的方法。我不知道python的收藏库,谢谢我知道这是要发布的@DeanChristianArmada:另一个选项是将dict中的项转换为元组中的元组,但由于dict是无序的,因此需要对它们进行排序<代码>{a':1,'b':2}.items()返回
[('a',1),('b',2)]
[('b',2),('a',1)]
,这也是一个很长的方法。我不了解python的集合库