Подтвердить что ты не робот

Преобразование словаря в список?

Возможный дубликат:
Как преобразовать словарь Python в список кортежей?

Я пытаюсь преобразовать словарь Python в список Python, чтобы выполнить некоторые вычисления.

#My dictionary
dict = {}
dict['Capital']="London"
dict['Food']="Fish&Chips"
dict['2012']="Olympics"

#lists
temp = []
dictList = []

#My attempt:
for key, value in dict.iteritems():
    aKey = key
    aValue = value
    temp.append(aKey)
    temp.append(aValue)
    dictList.append(temp) 
    aKey = ""
    aValue = ""

Это моя попытка... но я не могу понять, что неправильно?

4b9b3361

Ответ 1

Ваша проблема в том, что у вас есть key и value в кавычках, что делает их строками, т.е. вы устанавливаете aKey, чтобы содержать строку "key", а не значение переменной key. Кроме того, вы не очищаете список temp, поэтому вы добавляете его каждый раз, вместо того, чтобы иметь только два элемента.

Чтобы исправить свой код, попробуйте что-то вроде:

for key, value in dict.iteritems():
    temp = [key,value]
    dictlist.append(temp)

Вам не нужно копировать переменные цикла key и value в другую переменную перед их использованием, поэтому я их исключил. Аналогично, вам не нужно использовать append для создания списка, вы можете просто указать его между квадратными скобками, как показано выше. И мы могли бы сделать dictlist.append([key,value]), если бы мы хотели быть как можно более краткими.

Или просто используйте dict.items(), как было предложено.

Ответ 2

dict.items()

Есть трюк.

Ответ 3

Преобразование из dict в список упрощается в Python. Три примера:

>> d = {'a': 'Arthur', 'b': 'Belling'}

>> d.items()
[('a', 'Arthur'), ('b', 'Belling')]

>> d.keys()
['a', 'b']

>> d.values()
['Arthur', 'Belling']

Ответ 4

Вы должны использовать dict.items().

Вот одно решение для вашей линейки:

[(k,v) for k,v in dict.items()]

и результат:

[('Food', 'Fish&Chips'), ('2012', 'Olympics'), ('Capital', 'London')]

или вы можете сделать

l=[]
[l.extend([k,v]) for k,v in dict.items()]

для

['Food', 'Fish&Chips', '2012', 'Olympics', 'Capital', 'London']

Ответ 5

 >>> a = {'foo': 'bar', 'baz': 'quux', 'hello': 'world'}
 >>> list(reduce(lambda x, y: x + y, a.items()))
 ['foo', 'bar', 'baz', 'quux', 'hello', 'world']

Для объяснения: a.items() возвращает список кортежей. Добавление двух кортежей вместе создает один кортеж, содержащий все элементы. Таким образом, сокращение создает один кортеж, содержащий все ключи и значения, а затем список (...) составляет список из этого.

Ответ 6

Вероятно, вы просто хотите это:

dictList = dict.items()

У вашего подхода есть две проблемы. Для одного вы используете key и value в кавычках, которые представляют собой строки с буквами "ключ" и "значение", не связанные с переменными этих имен. Также вы продолжаете добавлять элементы во "временный" список и никогда не избавляетесь от старых элементов, которые уже есть в нем, с предыдущих итераций. Убедитесь, что у вас есть новый и пустой temp список в каждой итерации и используйте переменные key и value:

for key, value in dict.iteritems():
    temp = []
    aKey = key
    aValue = value
    temp.append(aKey)
    temp.append(aValue)
    dictList.append(temp)

Также обратите внимание, что это может быть написано короче без временных переменных, а именно items() вместо iteritems() в Python 3:

for key, value in dict.items():
    dictList.append([key, value])

Ответ 7

Если вы создаете словарь только для составления списка кортежей, то для создания dicts, как вы, возможно, будет боль, вы можете посмотреть на использование zip()

Его особенно полезно, если у вас есть один заголовок и несколько строк. Например, если я предполагаю, что вы хотите, чтобы статистика олимпийских игр для стран:

headers = ['Capital', 'Food', 'Year']
countries = [
    ['London', 'Fish & Chips', '2012'],
    ['Beijing', 'Noodles', '2008'],
]

for olympics in countries:
    print zip(headers, olympics)

дает

[('Capital', 'London'), ('Food', 'Fish & Chips'), ('Year', '2012')]
[('Capital', 'Beijing'), ('Food', 'Noodles'), ('Year', '2008')]

Не знаю, если это конечная цель, и я не в теме, но это может быть что-то, о чем нужно помнить.