2014-11-04 4 views
2

죄송합니다. 바보 같은 질문 인 것처럼 들리지만이 문제로 인해 혼란 스러울 수 있습니다. 나는 파이썬에 상당히 익숙하다. 그래서 나는 아마도 뭔가를 놓친다. 나는 약간의 연구를했지만 너무 멀지 않았다. 여기에 간다 :중첩 목록 비교 및 ​​편집

질문을 명확하게하는 간단한 예를 사용 하겠지만, 데이터는 다르지만 형식과 필요한 조치는 동일합니다. 우리는 사람과 그들이 먹는 피자 (및 다른 데이터)의 데이터베이스를 가지고 있습니다. 그러나 우리 데이터베이스에는 다른 피자를 가진 동일한 사람들의 여러 항목이 있습니다 (왜냐하면 우리는 다른 피자 가게에서 얻은 데이터를 결합했기 때문입니다).

예를 들어 데이터 세트 :

allData = [['joe','32', 'pepperoni,cheese'],['marc','24','cheese'],['jill','27','veggie supreme, cheese'],['joe','32','pepperoni,veggie supreme']['marc','25','cheese,chicken supreme']]

거의 우리가 알 사물과 규칙은 I 따르십시오 :

  • 이름은 있지만 여러 번 나타날 수 있습니다 우리가 알고있는이 특정한 경우에 동일한 이름을 가진 항목이 모두 같은 사람인 경우

  • 다른 항목의 같은 사람의 나이가 다를 수 있으므로 우리가 만난 사람의 첫 번째 나이를 선택하고 사용합니다. 예를 marc의 나이는 24이며, 우리는 두 번째 항목에서 25을 무시

나는 사람의 이름이 한 번만 표시되도록 데이터를 편집 할, 그가 먹는 피자는 모든 항목에서 고유 한 세트입니다 같은 이름으로. 앞에서 언급했듯이, 나이는 처음으로 발생하는 것입니다. 따라서, 나는이처럼 보이도록 최종 데이터를 원하는 것 :

fixedData = [['joe','32','pepperoni,cheese,veggie supreme'],['marc','24','cheese,chicken supreme'],['jill','27','veggie supreme, cheese']]

를 내가의 라인에 뭔가를 생각하고 있어요 :

fixedData = [] 
for i in allData: 
    if i[0] not in fixedData[0]:  
     fixedData.append[i] 
    else: 
     fixedData[i[-1]]=set(fixedData[i[-1]],i[-1]) 

내가 만들고있어 알고 몇 가지 실수. 제발 올바른 방향으로 나를 가리 키시겠습니까?

감사합니다.

답변

1

이름은 고유하므로 이름을 키로하는 dict에서 키로 사용할 수 있습니다. 이것은 귀하의 경우에 훨씬 더 적절합니다 :

>>> d = {} 
>>> for i in allData: 
    if i[0] in d: 
     d[i[0]][-1] = list(set(d[i[0]][-1] + (i[-1].split(',')))) 
    else: 
     d[i[0]] = [i[1],i[2].split(',')] 


>>> d 
    {'jill': ['27', ['veggie supreme', ' cheese']], 'joe': ['32', ['pepperoni', 'cheese', 'pepperoni', 'veggie supreme']], 'marc': ['24', ['cheese', 'cheese', 'chicken supreme']]} 
+0

정확히 내가 필요한 것입니다. 고맙습니다. –

+0

당신을 환영합니다. 슬프 도다, 나는 3333 포인트를 쳤다. 누가 지금 나를 업신 여기고이 독특한 숫자를 파괴 할 것인가. – WeaselFox

0

내가 좋아하는 경우에는 defaultdict를 사용하고 싶습니다. 목록 인덱스와 함께 제공되는 추측을 정말 싫어합니다.

from collections import defaultdict 

allData = [['joe', '32', 'pepperoni,cheese'], 
      ['marc', '24', 'cheese'], 
      ['jill', '27', 'veggie supreme, cheese'], 
      ['joe', '32', 'pepperoni,veggie supreme'], 
      ['marc', '25', 'cheese,chicken supreme']] 

d = defaultdict(dict) 
for name, age, pizzas in allData: 
    d[name].setdefault('age', age) 
    d[name].setdefault('pizzas', set()) 
    d[name]['pizzas'] |= set(pizzas.split(',')) 

공지 사항 setdefault의 사용은 우리가 처음 나올 나이 값을 설정합니다. 또한 유니온을 사용하여 고유 한 피자를 가져올 수 있습니다.