2013-08-14 2 views
2

임의의 수의 사전 입력을 사용하고 모든 입력이 포함 된 새 사전을 만드는 함수를 만들려고합니다. 두 개의 키가 같으면 두 값이 모두 포함 된 값이어야합니다. 나는이 일을 succeded - 그러나, 나는 dict() 함수에 문제가있어. 파이썬 셸에서 수동으로 dict 함수를 수행하면 문제없이 새 사전을 만들 수 있습니다. 그러나이 함수가 내 함수에 포함되어 있으면 TypeError가 발생합니다. 여기 아래에있는 내 코드는 다음과 같습니다Python에서 TypeError의 dict() 문제 : 'tuple'객체를 호출 할 수 없습니다.

#Module 6 Written Homework 
#Problem 4 

dict1= {'Fred':'555-1231','Andy':'555-1195','Sue':'555-2193'} 
dict2= {'Fred':'555-1234','John':'555-3195','Karen':'555-2793'} 

def dictcomb(*dict): 
    mykeys = [] 
    myvalues = [] 
    tupl =() 
    tuplist = [] 
    newtlist = [] 
    count = 0 
    for i in dict: 
     mykeys.append(list(i.keys())) 
     myvalues.append(list(i.values())) 
     dictlen = len(i) 
     count = count + 1 
    for y in range(count): 
     for z in range(dictlen): 
      tuplist.append((mykeys[y][z],myvalues[y][z])) 
    tuplist.sort() 
    for a in range(len(tuplist)): 
     try: 
      if tuplist[a][0]==tuplist[a+1][0]: 
       comblist = [tuplist[a][1],tuplist[a+1][1]] 
       newtlist.append(tuple([tuplist[a][0],comblist])) 
       del(tuplist[a+1]) 
      else: 
       newtlist.append(tuplist[a]) 
     except IndexError as msg: 
      pass 
    print(newtlist) 
    dict(newtlist) 

다음과 같이 내가 오류는 다음과 같습니다

Traceback (most recent call last): 
    File "<pyshell#17>", line 1, in <module> 
    dictcomb(dict1,dict2) 
    File "C:\Python33\M6HW4.py", line 34, in dictcomb 
    dict(newtlist) 
TypeError: 'tuple' object is not callable 

내가 파이썬 쉘, 인쇄 (newtlist)에서, 전술 한 바와 같이 제공합니다

[('Andy', '555-1195'), ('Fred', ['555-1231', '555-1234']), ('John', '555-3195'),  ('Karen', '555-2793')] 

이 출력을 복사하여 dict() 함수에 붙여 넣으면 :

dict([('Andy', '555-1195'), ('Fred', ['555-1231', '555-1234']), ('John', '555-3195'), ('Karen', '555-2793')]) 
{'Karen': '555-2793', 'Andy': '555-1195', 'Fred': ['555-1231', '555-1234'], 'John': '555-3195'} 

은 내가 노력할 상관없이, 내 함수 내에서이 문제를 재현 할 수 없습니다 :

출력은 I 인, 원하는됩니다. 제발 도와주세요! 고맙습니다!

답변

8

키워드를 변수 이름으로 사용하지 않아야하는 전형적인 예입니다. 여기서 dict(newtlist)dict() 파이썬을 호출하려고 시도하지만 충돌하는 지역 변수 dict이 있습니다. 문제를 해결하려면 해당 변수의 이름을 변경하십시오. 이 같은

뭔가 :

def dictcomb(*dct): #changed the local variable dict to dct and its references henceforth 
    mykeys = [] 
    myvalues = [] 
    tupl =() 
    tuplist = [] 
    newtlist = [] 
    count = 0 
    for i in dct: 
     mykeys.append(list(i.keys())) 
     myvalues.append(list(i.values())) 
     dictlen = len(i) 
     count = count + 1 
    for y in range(count): 
     for z in range(dictlen): 
      tuplist.append((mykeys[y][z],myvalues[y][z])) 
    tuplist.sort() 
    for a in range(len(tuplist)): 
     try: 
      if tuplist[a][0]==tuplist[a+1][0]: 
       comblist = [tuplist[a][1],tuplist[a+1][1]] 
       newtlist.append(tuple([tuplist[a][0],comblist])) 
       del(tuplist[a+1]) 
      else: 
       newtlist.append(tuplist[a]) 
     except IndexError as msg: 
      pass 
    print(newtlist) 
    dict(newtlist) 
4

당신의 함수는 함수 인수 및 마스크에서 오는 dict라는 지역 변수가 내장 dict() 기능 :

def dictcomb(*dict): 
      ^
      change to something else, (*args is the typical name) 
0

당신이 구현해야합니까 이 모든 것을 직접 또는 defaultdict을 사용해도 되겠습니까? 그렇다면 다음과 같이 할 수 있습니다.

from collections import defaultdict 

merged_collection = defaultdict(list) 
collection_1= {'Fred':'555-1231','Andy':'555-1195','Sue':'555-2193'} 
collection_2= {'Fred':'555-1234','John':'555-3195','Karen':'555-2793'} 

for collection in (collection_1, collection_2): 
    for name, number in collection.items(): 
     merged_collection[name].append(number) 

for name, number in merged_collection.items(): 
    print(name, number) 

John ['555-3195'] 
Andy ['555-1195'] 
Fred ['555-1231', '555-1234'] 
Sue ['555-2193'] 
Karen ['555-2793'] 
관련 문제