У меня есть словарь, как этотПолучение одно значение из нескольких значений в словаре
dic={10:(1,4),20:(2,4),30:(3,4)}
как получить 1,2,3
в качестве выходного сигнала с использованием dic.values()
без использования for
цикла.
У меня есть словарь, как этотПолучение одно значение из нескольких значений в словаре
dic={10:(1,4),20:(2,4),30:(3,4)}
как получить 1,2,3
в качестве выходного сигнала с использованием dic.values()
без использования for
цикла.
Это работает:
>>> dic={10:(1,4),20:(2,4),30:(3,4)}
>>> [x[0] for x in dic.values()]
[1, 2, 3]
>>> # Or if you want that as a tuple
>>> tuple(x[0] for x in dic.values())
(1, 2, 3)
>>> # Or a string
>>> ",".join([str(x[0]) for x in dic.values()])
'1,2,3'
>>>
Вы должны помнить, однако, что порядок словарей не гарантируется. Значение, пары ключ/значение не всегда будут в том порядке, в котором вы их вставляете.
Чтобы получить неупорядоченные результаты в нужном порядке, вы должны посмотреть на sorted
.
+1. Но OP не запрашивал вывод строки. Вы просто показываете, @iCodez. ;) –
@ ron.rothman - ОП никогда не говорил, что такое «1,2,3».Похоже, он просто хочет список значений ... но я на всякий случай накрыл все базы. ;) – iCodez
Собственно, '' 1, 2, 3''! = ''1,2,3'': P –
Ответ: Вы не можете. Вам придется перебрать словарь:
for v in d.values():
print v[0]
Или, используя список понимание:
[v[0] for v in d.values()]
Эта фильтрация методы являются лучшими вы можете найти :)
Это решение не любой лучше, чем при использовании итераторов, но он имеет другой подход и, возможно, более подходит для сложных задач:
from operator import itemgetter
dic={10:(1,4),20:(2,4),30:(3,4)}
print map(itemgetter(0), dic.values())
дает:
[1, 2, 3]
Как об использовании карты здесь.
map(lambda x: x[0], dic.values())
Быстрее, чем цикл. Как? 'map' с лямбдой всегда медленнее, чем эквивалентное понимание списка. –
@aro У вас было время? –
@AshwiniChaudhary Да, мне всегда казалось, что карта оптимизирована, чем цикл (в основном потому, что карты реализованы на C). Значит, вы хотите сказать, что карты медленнее? – Arovit
Если вы посмотрите на то dic.values () производит:
>>> dic={10:(1,4),20:(2,4),30:(3,4)}
>>> dic.values()
[(1, 4), (2, 4), (3, 4)]
Очевидно, что вы хотите, первый элемент каждого кортежа.
Вы можете использовать zip, чтобы получить это без цикла .
>>> zip(*dic.values())[0]
(1, 2, 3)
Как было отмечено в комментариях, еще более эффективным решением является:
>>> from itertools import izip
>>> next(izip(*dic.itervalues()))
(1, 2, 3)
Тогда вам не придется пройти весь путь, хотя создание нескольких списков только, чтобы получить первый элемент.
Порядок, конечно, зависит от порядка ключей в dic.
«Без петлирования» - это глупое различие ИМХО. Каждое решение имеет явный или неявный цикл в нем ...
Я думаю, что 'itertools.izip' будет лучше, поскольку он не будет создавать ненужный список в памяти. 'next (itertools.izip (* dic.itervalues ()))' –
@AshwiniChaudhary: Согласен. Ред. – dawg
Я согласен с вашей сноской. Я думаю, что OP должен был сказать «в одной строке», а не «без петли», потому что в противном случае вы правы, цикл неизбежен. – SethMMorton
Вы не указали, что определяет порядок '1,2,3': первый элемент каждого значения, отсортированный? Первый элемент значений, связанных с отсортированными ключами? И т.д. – DSM