2017-01-07 4 views
1

У меня есть список кортежей строк:Эффективное отображение между первым элементом каждого кортежа в списке и алфавитные символы

lst = [('first', 'one'), ('second', 'two'), ('third', 'three'), ('fourth', 'four')] 

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

  • 'first' отображается в 'a'
  • 'second' отображенной в 'b'
  • 'third' отображается в 'c'
  • 'fourth' отображенной в 'd'

Я попытался словарь

dct = {'first': 'a', 'second': 'b', 'third': 'c', 'fourth': 'd'} 

, но мне было интересно, если есть более эффективный подход, который позволит создать список, содержащий первый элемент кортежей и список алфавитов, а затем итерацию их для создания словаря.

Кроме того, для символов алфавита я попытался использовать string.ascii_lowercase, но он дает строку не как список каждого символа.

Я новичок в Python, поэтому извините, если вопрос является основным. Я был бы признателен за любой пример кода, который я мог бы понять и узнать.

ответ

2

Вы можете использовать zip() и словарь comprehension:

>>> from string import ascii_lowercase 
>>> lst = [('first', 'one'), ('second', 'two'), ('third', 'three'), ('fourth', 'four')] 
>>> {x[0]: y for x, y in zip(lst, ascii_lowercase)} 
{'first': 'a', 'second': 'b', 'third': 'c', 'fourth': 'd'} 

или если вы хотите сделать это в более «функциональной» способом:

>>> from operator import itemgetter 
>>> {x: y for x, y in zip(map(itemgetter(0), lst), ascii_lowercase)} 
{'first': 'a', 'second': 'b', 'third': 'c', 'fourth': 'd'} 
+0

Отличный ответ. Не могли бы вы добавить небольшое объяснение различий между двумя способами с точки зрения эффективности, а также объяснить функции 'map' и' itemgetter'? – Karim

+0

Я вряд ли могу объяснить их лучше, чем документы для ['map()'] (https://docs.python.org/3.6/library/functions.html#map) и ['itemgetter()'] (https://docs.python.org/3.6/library/operator.html#operator.itemgetter). Что касается эффективности, первая версия будет более эффективной, так как она потребует меньше вызовов функций. –

1

Конечно, вы можете добиться того, что с помощью словаря понимание и использование string библиотека:

from string import ascii_lowercase 

{lst[i][0]: c for i, c in enumerate(ascii_lowercase)} 
1

Вы можете создать свой желаемый dict используя zip как:

from string import ascii_lowercase 
lst = [('first', 'one'), ('second', 'two'), ('third', 'three'), ('fourth', 'four')] 

my_dict = dict(zip(list(zip(*lst))[0], ascii_lowercase)) # in python 3 
# In python 2, you may just do: 
#  my_dict = dict(zip(zip(*lst)[0], ascii_lowercase)) 

, а еще лучше, чтобы использовать его с operator.itemgetter как:

my_dict = dict(zip(map(itemgetter(0), lst), ascii_lowercase)) 

трюме Значение по my_dict будет:

{'first': 'a', 'second': 'b', 'third': 'c', 'fourth': 'd'} 

Объяснение:

Вы были почти там. string.ascii_lowercase возвращает строку, но вы можете итерировать строку и получить доступ к элементу на основе индекса (так же, как вы делаете с list).Например:

my_alphas = string.ascii_lowercase 

# Iterate the string, valid 
for alpha in my_alphas: 
    print alpha 

# access based on index, valid 
my_alphas[13] 

В качестве дополнительной части информации, даже если вам не нужно это: Если вы хотите, чтобы преобразовать string в list, вы можете набрать отливка как:

my_alpha_list = list(string.ascii_lowercase) 
#^will hold all the alphabets in the form of list 
+0

Я ценю объяснение. Тем не менее, я получаю объект «zip», который не является подписчивым, и в интересах изучения Python я хотел бы знать, почему, если вы можете это понять. Спасибо – Karim

+0

@Karim Мой плохой. Я не видел тег Python 3. В python 3 'zip' возвращает объект типа' zip', и вы должны явно вводить его в список, чтобы заставить его работать. Обновлен ответ –

+0

Спасибо за обновление. Не могли бы вы также добавить небольшое объяснение подхода 'itemgetter'; почему это лучше и как оно отличается? – Karim

1
import string 
lst = [('first', 'one'), ('second', 'two'), ('third', 'three'), ('fourth', 'four')] 
alphabetList = [i for i in string.ascii_lowercase ] 
dic = {lst[i] : alphabetList[i] for i in range(len(lst))} 
print(dic)