2016-09-14 5 views
-3

이전 버전의 python을 사용하고 있는데 dict의 빼기 지원이 없습니다.지원되지 않는 피연산자 유형 - 목록 및 목록

d1={'ab': ['3'], 'hij': ['1200']} 
d2={'ab': ['1'], 'hij': ['600']} 

는 기본적으로 내 코드는 다음과 같습니다 : 그것은 지원되지 않는 피연산자 유형 반환

d2={'ab': ['2'], 'hij': ['600']} 

처럼

for key in d1.keys(): 
     if key in d2: 
      d3[key]=d1[key]-d2[key] 

출력해야한다 : - 목록과 목록을. 이

+0

d1과 d2의 내용을 게시하십시오. – karlosss

+3

하나의 목록에서 다른 목록을 뺍니다. 결과로 얻을 것으로 예상되는 것은 무엇입니까? – mgilson

+0

키 값의 차이를 포함하는 다른 목록 – identical123456

답변

0

목록에서 첫 번째 값을 얻고 int들로 캐스팅.

d1 = {'ab': ['3'], 'hij': ['1200']} 
d2 = {'ab': ['1'], 'hij': ['600']} 
d3 = {} 

for key in d1.keys(): 
    if key in d2: 
     d3[key] = int(d1[key][0]) - int(d2[key][0]) 

print d3 

출력 :

{'hij': 600, 'ab': 2} 

가 수레를 지원하기 위해, 당신은 float으로 캐스팅해야합니다. 네 자릿수의 정밀도를 원할 경우 round 기능을 사용할 수 있습니다.

d1 = {'ab': ['3.2462353'], 'hij': ['1200.223353']} 
d2 = {'ab': ['1.346733'], 'hij': ['600.252341']} 
d3 = {} 

for key in d1.keys(): 
    if key in d2: 
     num1 = float(d1[key][0]) 
     d3[key] = round(float(d1[key][0]) - float(d2[key][0]), 4) 

print d3 

출력 : 당신은 너무 같은 목록을 뺄 수 없습니다

{'hij': 599.971, 'ab': 1.8995} 
+0

일부 정수가 있기 때문에 float를 사용해야했습니다. 어쨌든 나는 현재 얻고있는 많은 것보다 단지 크기와 단지 4 자리 숫자를 반환해야합니다. 또한, 모든 키에 대해 동일한 차이 값을 얻은 이후로는 효과가 없다고 생각합니다. – identical123456

+0

4 자리수의 부동 소수점을 지원하도록 업데이트되었습니다. 그리고 네, 작동합니다. 내가 한 입력 출력을 확인하십시오. 맞습니다. – Jarvis

+0

동일한 차이가 무슨 뜻인지 확실하지 않습니다. – Jarvis

0

극복하는 방법에 모든 아이디어는 다음과 같은 시도 :

d1={'ab': ['3'], 'hij': ['1200']} 
d2={'ab': ['1'], 'hij': ['600']} 
d3={} 
for key in d1.keys(): 
    if key in d2: 
     d3[key] = [str(int(d1[key][i]) - int(d2[key][i])) for i in xrange(len(d1[key]))] 
print d3 
+0

잘못된 구문이 표시됩니다. – identical123456

+0

수정되었습니다. 지금 시도해보십시오. – galah92

+0

- : str 및 str에 대해 지원되지 않는 피연산자 유형 – identical123456

0

.

d1={'ab': ['3'], 'hij': ['1200']} 
d2={'ab': ['1'], 'hij': ['600']} 

d3 = {k: ['{}'.format(int(i) - int(j)) for i, j in zip(d1[k], d2[k])] for k in d1} 
print(d3) 
# {'hij': ['600'], 'ab': ['2']} 

공지 문자열 서식을 사용하여 문자열의 뒤쪽으로 int에 주조 및 항목 : 당신이 다음 콘텐츠를 뺄 수

당신은 목록을 대신 사전 comprehensio N을 사용하고 zip 수 있습니다. 데이터가 실제로 정수로 저장 되었다면 더 좋을 수도 있습니다.

+0

나를위한 잘못된 구문이 있습니다. – identical123456

+0

나는 당신이'>>>' –

0

오류에 대한 아이디어를 얻으려면 d1 [key] 및 d2 [key]를 살펴 보셨습니까? 그렇지 않으면 코드 디버깅의 첫 단계 : 실패한 부분과 실패한 부분을 확인합니다.

그래서 문제의 설명은 다음과 같습니다. d1 [ 'ab']는 숫자가 아니며, 목록입니다.이 목록은 ['3']입니다. 따라서 d1['ab'] - d2['ab']을 작성하면 ['3'] - ['1']으로 변환되고 이는 list() - list()과 같을 것이며 오류 상태는 두 목록을 빼낼 방법이 없으므로 연산이 정의되지 않습니다. 그래서 당신이 원하는 것은 안에있는 것입니다. 목록 자체는 아니지만 그 목록 안에서는주의해야합니다. 문자열 실제 번호가 아니므로 문자열을 숫자로 변환해야만 다음과 같이됩니다. 예상 된 substaction을 수행 할 수 있습니다.

하지만 모두 상당히 지루하고 나는 코드를 작성할 때 사전 작성법을 완전히 이해하지 못했다고 가정합니다.숫자를 문자열로 넣고 목록에 넣을 필요는 없습니다. 숫자를 직접 넣을 수 있습니다 : d1={'ab': 3, 'hij': 1200}은 완벽하게 유효한 파이썬 코드입니다. 그런 다음 d1['ab']으로 전화하면 예상 한 번호를 직접 얻을 수 있습니다.

+0

을 복사하지 않았다고 믿고 싶습니다. 설명해 주셔서 감사합니다. "d1.setdefault (name, []). append (number)"를 사용하여 사전을 가져 왔습니다. append (float (number))로 변경하면 트릭을 올바르게 수행해야합니다. – identical123456

관련 문제