2015-12-03 3 views
1

Как выполнить итерацию по строкам внутри списка, чтобы я мог добавлять определенные значения в словарь? Например, с данным списком, я хотел бы установить цены для каждого элемента как словарные ключи и их соответствующие элементы для значений.Итерация по строкам внутри списка

Дано:

list = ["10.99,cheese pizza", "4.99,vanilla milkshake", "4.99,chocolate milkshake"] 

Выход (при пустой словарь):

{"10.99": ["cheese pizza"], "4.99": ["vanilla milkshake", "chocolate milkshake"]} 

Вот моя попытка:

list = ["10.99,cheese pizza", "4.99,vanilla milkshake", "4.99,chocolate milkshake"] 

list = str(list)[1:-1].split(",") 
listofitems = {} 

ctr = 0 
while ctr < len(list): 
    listofitems[list[0]] = str(list[ctr]) 
    print listofitems 
    ctr = ctr + 1 

И мой выход таков:

{"'10.99": "'10.99"} 
{"'10.99": "cheese pizza'"} 
{"'10.99": " '4.99"} 
{"'10.99": "vanilla milkshake'"} 
{"'10.99": " '4.99"} 
{"'10.99": "chocolate milkshake'"} 

Что я делаю неправильно?

+0

Это не будет действительный словарь. В словаре может быть только один ключ. – Zizouz212

ответ

3

Хорошо, у вас здесь много вещей, но вы близки.

Во-первых, не вызывайте вещи после встроенных функций python, например list.

Я сломаю мой ответ вниз построчно, так что вы можете получить это:

  1. str преобразует список в строку, а затем вы пытаетесь spliting его. Вместо этого сохраните список как есть и используйте list comprehension над ним, чтобы разбить каждую строку в списке. Кроме того, используя item.split(',',1), мы вынуждены расколоться только один раз, который появляется в руке, если элемент имеет запятую - например, Ham, cheese & tomato pizza.

    list = str(list)[1:-1].split(",") 
    items = [item.split(',',1) for item in items] 
    
  2. Использование for петля, а не while, как вы знаете, список по вашему циклу будет закончены. Кроме того, поскольку каждый элемент представляет собой пару пунктов, мы можем даже распаковать их в цикл:

    for price,item in items: 
    
  3. Использование Dict.get безопасно получить либо деталь с этим ключом, и по умолчанию, если он не существуют:

    price_set = item_dict.get(price,[]) 
    

Вот моя полная версия:

items = ["10.99,cheese pizza", "4.99,vanilla milkshake", "4.99,chocolate milkshake"] 

items = [item.split(',',1) for item in items] 

item_dict = {} 

for price,item in items: 
    price_set = item_dict.get(price,[]) 
    item_dict[price] = price_set + [item] 

print item_dict 

Это выходы:

{'10.99': ['cheese pizza'], '4.99': ['vanilla milkshake', 'chocolate milkshake']} 
+1

Большое спасибо! –

2
l = ["10.99,cheese pizza", "4.99,vanilla milkshake", "4.99,chocolate milkshake"] 
d = {} 
for e in l: 
    k,v = e.split(",") 
    if d.has_key(k): 
     d[k] += [v] 
    else: 
     d[k] = [v] 
+0

'split()' уже создает 'list'. Вам не нужен другой уровень понимания. Кроме того, не называйте его 'dict'. – TigerhawkT3

+0

Очень полезно! Спасибо! –

+0

Спасибо, @ TigerhawkT3, исправление. Также подтвердил ваш ответ: действительно хорошо, чтобы получить лучшие способы сделать это (все еще n00b). :) d = {ключ: значение для (ключ, значение) в [(k, v) для k, v in (x.split (",") для x в списке)]} – user244255

2

Вот более вещий 2 лайнера с участием словаря композиции.

l = ["10.99,cheese pizza", "4.99,vanilla milkshake", "4.99,chocolate milkshake"] 

products = [item.split(',') for item in l] 
output = {y[0]:[x[1] for x in products if x[0] == y[0]] for y in products} 

Сначала он разбивает и форматирует их в продукты, а затем группирует по цене в словарь.

+0

Большое вам спасибо! –

Смежные вопросы