Преобразование словаря в список?
Возможный дубликат:
Как преобразовать словарь 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 = ""
Это моя попытка... но я не могу понять, что неправильно?
Ответы
Ответ 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')]
Не знаю, если это конечная цель, и я не в теме, но это может быть что-то, о чем нужно помнить.