3

У меня есть список, как, например:Преобразование списка в многозначной Словаре

pokemonList = ['Ivysaur', 'Grass', 'Poison', '', 'Venusaur', 'Grass', 'Poison', '', 'Charmander', 'Fire', ''...] 

Обратите внимание, что шаблон 'Pokemon name', 'its type', ''...next pokemon

Pokemon приходят в обеих формах одиночных и двойных типа. Как я могу закодировать это так, чтобы каждый покемон (ключ) имел свой тип (ы), применяемый в качестве его значения?

То, что я получил до сих пор:

types = ("", "Grass", "Poison", "Fire", "Flying", "Water", "Bug","Dark","Fighting", "Normal","Ground","Ghost","Steel","Electric","Psychic","Ice","Dragon","Fairy") 
pokeDict = {} 
    for pokemon in pokemonList: 
     if pokemon not in types: 
      #the item is a pokemon, append it as a key 
     else: 
      for types in pokemonList: 
       #add the type(s) as a value to the pokemon 

Правильный словарь будет выглядеть следующим образом:

{Ivysaur: ['Grass', 'Poison'], Venusaur['Grass','Poison'], Charmander:['Fire']} 
+0

У вас всегда есть пустая строка в списке после каждого покемона? –

+0

Да. (спасибо, красивый). – avereux

ответ

3

Просто перебирать список и построить элемент для Dict соответствующим ..

current_poke = None 
for item in pokemonList: 
    if not current_poke: 
     current_poke = (item, []) 
    elif item: 
     current_poke[1].append(item) 
    else: 
     name, types = current_poke 
     pokeDict[name] = types 
     current_poke = None 
1

Вот низкотехнологичный способ сделать это: перебирать список и собирать записи по ходу дела.

key = "" 
values = [] 
for elt in pokemonList: 
    if not key: 
     key = elt 
    elif elt: 
     values.append(elt) 
    else: 
     pokeDict[key] = values 
     key = "" 
     values = [] 
+0

Этот код очень аккуратный и легкий для чтения. Хотел бы я согласиться на оба ответа! – avereux

+0

Нет проблем, это ваша прерогатива принять любой ответ, который вам больше нравится. (Но вы можете выдвигать столько ответов, сколько пожелаете ;-) – alexis

2

Рекурсивные функции нарезать первоначальный список, и словарь понимание для создания Dict:

# Slice up into pokemon, subsequent types 
def pokeSlice(pl): 
    for i,p in enumerate(pl): 
     if not p: 
      return [pl[:i]] + pokeSlice(pl[i+1:])  
    return [] 

# Returns: [['Ivysaur', 'Grass', 'Poison'], ['Venusaur', 'Grass', 'Poison'], ['Charmander', 'Fire']] 

# Build the dictionary of 
pokeDict = {x[0]: x[1:] for x in pokeSlice(pokemonList)} 

# Returning: {'Charmander': ['Fire'], 'Ivysaur': ['Grass', 'Poison'], 'Venusaur': ['Grass', 'Poison']} 
1

Один лайнер. Не потому, что это полезно, но потому, что я начал пытаться и должен был закончить.

>>> pokemon = ['Ivysaur', 'Grass', 'Poison', '', 'Venusaur', 'Grass', 'Poison', '', 'Charmander', 'Fire', ''] 
>>> { pokemon[i] : pokemon[i+1:j] for i,j in zip([0]+[k+1 for k in [ brk for brk in range(len(x)) if x[brk] == '' ]],[ brk for brk in range(len(x)) if x[brk] == '' ]) } 
{'Venusaur': ['Grass', 'Poison'], 'Charmander': ['Fire'], 'Ivysaur': ['Grass', 'Poison']}