2013-12-02 3 views
0

У меня есть словарь, как этотПолучение одно значение из нескольких значений в словаре

dic={10:(1,4),20:(2,4),30:(3,4)} 

как получить 1,2,3 в качестве выходного сигнала с использованием dic.values() без использования for цикла.

+2

Вы не указали, что определяет порядок '1,2,3': первый элемент каждого значения, отсортированный? Первый элемент значений, связанных с отсортированными ключами? И т.д. – DSM

ответ

5

Это работает:

>>> 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.

+0

+1. Но OP не запрашивал вывод строки. Вы просто показываете, @iCodez. ;) –

+0

@ ron.rothman - ОП никогда не говорил, что такое «1,2,3».Похоже, он просто хочет список значений ... но я на всякий случай накрыл все базы. ;) – iCodez

+0

Собственно, '' 1, 2, 3''! = ''1,2,3'': P –

1

Ответ: Вы не можете. Вам придется перебрать словарь:

for v in d.values(): 
    print v[0] 

Или, используя список понимание:

[v[0] for v in d.values()] 

Эта фильтрация методы являются лучшими вы можете найти :)

+0

«Вы не можете» прямо противоречит вашему второму ответу [который доказывает, что вы действительно можете]. –

+0

@AshwiniChaudhary кричит, исправлено. Я имел в виду «ценности». – aIKid

+0

@ ron.rothman Но это все еще считается прокруткой словаря, не так ли? – aIKid

0

Это решение не любой лучше, чем при использовании итераторов, но он имеет другой подход и, возможно, более подходит для сложных задач:

from operator import itemgetter 
dic={10:(1,4),20:(2,4),30:(3,4)} 
print map(itemgetter(0), dic.values()) 

дает:

[1, 2, 3] 
0

Как об использовании карты здесь.

map(lambda x: x[0], dic.values()) 
+2

Быстрее, чем цикл. Как? 'map' с лямбдой всегда медленнее, чем эквивалентное понимание списка. –

+0

@aro У вас было время? –

+0

@AshwiniChaudhary Да, мне всегда казалось, что карта оптимизирована, чем цикл (в основном потому, что карты реализованы на C). Значит, вы хотите сказать, что карты медленнее? – Arovit

2

Если вы посмотрите на то 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.

«Без петлирования» - это глупое различие ИМХО. Каждое решение имеет явный или неявный цикл в нем ...

+2

Я думаю, что 'itertools.izip' будет лучше, поскольку он не будет создавать ненужный список в памяти. 'next (itertools.izip (* dic.itervalues ​​()))' –

+0

@AshwiniChaudhary: Согласен. Ред. – dawg

+1

Я согласен с вашей сноской. Я думаю, что OP должен был сказать «в одной строке», а не «без петли», потому что в противном случае вы правы, цикл неизбежен. – SethMMorton

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