У меня есть список кортежей строк:

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, так что извините, если вопрос выше является основным. Я был бы признателен за любой пример кода для меня, чтобы понять и изучить.

1
user6003691 7 Янв 2017 в 13:37

4 ответа

Лучший ответ

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

>>> 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'}
1
Eugene Yarmash 7 Янв 2017 в 11:07

Вы можете создать желаемый 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
Moinuddin Quadri 7 Янв 2017 в 12:12

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

from string import ascii_lowercase

{lst[i][0]: c for i, c in enumerate(ascii_lowercase)}
0
Jarek 7 Янв 2017 в 10:44
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)
1
hfz 7 Янв 2017 в 10:47