2015-08-02 2 views
0

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

k=('a', ['email1', 'email2']), ('b',['email3']) 

Когда я делаю это:

j=dict(k) 

он должен вернуть это согласно питона документации:

{'a': ['email1', 'email2'], 'b': ['email3']} 

Это достаточно просто, когда кортеж находится в ключевых парах значений. Но что, если вместо этого это был всего один кортеж? (Пример ниже):

k=('a', ['email1', 'email2'], 'b',['email3']) 

Я попытался сделать:

dict((k,)) 

Но это не работает, если есть более чем один элемент в кортеже.

EDIT

  1. Есть ли способ сделать это?
  2. В чем разница между dict((k,)) и dict[k]? Они, похоже, дают одинаковый выход.

ответ

2

Это фактически та же проблема, как How do you split a list into evenly sized chunks in Python? кроме вы хотите сгруппировать его на 2. Т.е.Дано:

def chunk(input, size): 
    return map(None, *([iter(input)] * size)) 

Вы бы:

k=('a', ['email1', 'email2'], 'b',['email3']) 
dict(chunk(k, 2)) 

Выход:

{'a': ['email1', 'email2'], 'b': ['email3']} 

Для Ваших дополнительных вопросов, которые вы используете python3? dict[k] может ударить __getitem__, но я не знаком с python3. dict((k,)) попадает в конструктор. В python2.7 они определенно не эквивалентны:

>>> dict((k,)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: dictionary update sequence element #0 has length 4; 2 is required 
>>> dict[k] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'type' object has no attribute '__getitem__' 
1

У вас не может быть списков в качестве словарных ключей. Словарь ключей может быть immutable, см. https://docs.python.org/2/tutorial/datastructures.html#dictionaries

Имея кортеж со списками как некоторые из ключей, как показывает ваш пример, он потерпит неудачу.

Кроме того, пример вашего кортежа работает только тогда, когда кортеж имеет два элемента, поэтому одним из них может стать ключ, а другой - значение. Я использовал этот пример:

k=('a', ['email1', 'email2']), ('b',['email3']), ('c',['email4'], 'a') 

и потому что последний кортеж имеет 3 предмета, он потерпит неудачу. Второй пример - один кортеж из более чем двух элементов, поэтому его нельзя преобразовать.

Я чувствую, что вы пытаетесь расширить функцию dict за то, что она предназначена, если вы хотите создавать словари для сборки, найдите функцию dict, найдите словарные словари или используйте для создания циклов для добавления элементов.

http://legacy.python.org/dev/peps/pep-0274/ < - dictionary comprehensions

Это не слишком ясно, что вы пытаетесь сделать, кроме простых преобразований кортежа в-Словаре.

1

можно сделать следующим образом:

k=('a', ['email1', 'email2'], 'b',['email3']) 
l = [(k[i], k[i+1]) for i in range(0, len(k), 2)] 
l = dict(l) 

print l 

Выход:

{'a': ['email1', 'email2'], 'b': ['email3']} 
1

Вы можете инициализировать в dict с list пар (длина 2 кортежей), поэтому он работает в этом случае:

k=('a', ['email1', 'email2']), ('b',['email3']) 
dict(k)  # key: a, b 
      # value: ['email1', 'email2'], ['email3'] 

Конструктор из dict будет принимать первый элемент в каждом tuple в качестве ключа, а второй - как значение.

В этом втором случае то, что вы проходите, является одним tuple с четырьмя элементами, нет эвристики для dict, чтобы различать «ключ» и «значение». Поэтому вам нужно следовать за ответом @Kit Sunde, чтобы разделить ваши кортежи.

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