2013-09-03 2 views
1

У меня есть список, и я хочу, чтобы преобразовать этот список в картусписок для отображения в питона

mylist = ["a",1,"b",2,"c",3] 

MyList эквивалентно

mylist = [Key,Value,Key,Value,Key,Value] 

Так Входной сигнал:

mylist = ["a",1,"b",2,"c",3] 

Выходной :

mymap = {"a":1,"b":2,"c":3} 

PS: Я уже написал следующие функции, которые делают ту же работу, но я хочу использовать итераторы инструменты питона:

def fun(): 
    mylist = ["a",1,"b",2,"c",3] 
    mymap={} 
    count = 0 
    for value in mylist: 
     if not count%2: 
      mymap[value] = mylist[count+1] 
     count = count+1 
    return mymap   

ответ

10

Использование iter и Dict-понимание:

>>> mylist = ["a",1,"b",2,"c",3] 
>>> it = iter(mylist) 
>>> {k: next(it) for k in it} 
{'a': 1, 'c': 3, 'b': 2} 

Использование zip и iter:

>>> dict(zip(*[iter(mylist)]*2)) #use `itertools.izip` if the list is huge. 
{'a': 1, 'c': 3, 'b': 2} 

Похожие: How does zip(*[iter(s)]*n) work in Python

+1

Это второе решение красиво. –

+1

Ashwini, Не могли бы вы объяснить свое второе решение? – Anurag

+1

@Anurag [Как 'zip (* [iter (s)] * n)' работать в Python] (http://stackoverflow.com/questions/2233204/how-does-zipitersn-work-in-python) –

0

Использование Сжать и цикл: -

from itertools import compress 
from itertools import cycle 

def fun(mylist): 
    keys = compress(mylist,cycle([1,0])) 
    values = compress(mylist,cycle([0,1])) 
    mymap = dict(zip(keys,values)) 
    return mymap 

mylist = ["a",1,"b",2,"c",3] 

fun(mylist) 
{'a': 1, 'c': 3, 'b': 2} 
4
>>> mylist = ["a",1,"b",2,"c",3] 
>>> zippedlist = zip(mylist [0::2],mylist [1::2]) #slicing magic 
>>> zippedlist 
[('a', 1), ('b', 2), ('c', 3)] 
>>> dictedlist = dict(zippedlist) 
>>> dictedlist 
{'a': 1, 'c': 3, 'b': 2} 

Это работает из-нарезка [start:stop:skip]

список, начиная с 0, пропуская 2

заархивированы с

список, начиная с 1, пропуская 2

1

Чтобы получить все ключи из списка вы можете сделать:

keys = mylist[::2] 

где MyList [:: 2] создает новый список по итерация каждый второй элемент в MyList начиная с индекса 0.

Для того, чтобы получить все значения из списка вы можете сделать:

vals = mylist[1::2] 

где mylist[1::2] создает новый список по итерацию каждый второй элемента в MyList начиная с индексом 1.

, а затем вы можете просто использовать Dict и почтовый индекс:

dict(zip(keys,vals)) # or all in one line 
dict(zip(mylist[::2], mylist[1::2])) 

зип принимает два списка, как ["a","b","c"] и [1,2,3] и «молнии» их вместе, чтобы дать список, как

[("a",1), ("b", 2), ("c", 3)] 

и dict принимает итератор пар и превращает их в словарь.