2013-06-01 3 views
1

Пусть у меня есть просмотровой список и словарь:Lookup поля по заказу

>>> l=['A','B','C'] 
>>> di={'A':3,'V':3,'M':7,'B':6,'D':2,'C':1} 

Я образуя просмотровой ключ, извлекая значения и добавления с «~»

>>> '~'.join(str(di.get(key)) for key in l) 

Поскольку этот ключ сформировал ядро ​​поиска - мне нужно было подтвердить, что он всегда будет возвращать одну и ту же строку.
Ничто в моем тесте пока не показывает иначе.
Любое предупредительное предупреждение было бы полезно.

+2

Как вы итерацию по списку не Сыроватского поэтому заказ всегда будет то же самое. –

+0

Итак, у списков нет проблемы, из-за которой dicts страдает - в значительной степени, как java, тогда – IUnknown

+0

Да, списки упорядоченной коллекции. Списки Python - это массивы переменной длины. –

ответ

1

Да, это приведет к результатам, которые всегда происходят в том же порядке, если вы не измените свой список. Наборы и дикты неупорядочены, и даже если у них есть порядок, на который вы можете положиться, они этого не делают. Существует определенный порядок, вы просто не можете рассчитывать на то, что вы ожидаете. Например, в Python 3.3 порядок меняется каждый раз, когда вы запускаете интерпретатор, потому что соль добавляется в хэш.

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

То, что вы написали, что эквивалентно:

result = [] 

# l has a consistent order, so the result will be in the order of l 
for key in l: 
    result.append(str(di.get(key))) 

'~'.join(result) 

..Это потерпит неудачу с TypeError, если значение в списке не является ключевым в Словаре, так что вы никогда не будете получать строки например, «3 ~~ 1».

+1

Это не сработает, даже если ключи определены, так как значения OPs dict являются int. – lqc

+0

Вы правы. ..forgot 'str'. ..исправлено. –

+1

Чтобы быть точным, dicts и устанавливает * do * имеют определенный порядок, который соответствует алгоритму хэширования. то есть. если хеш-рандомизация не включена, то данный dict (не только данный экземпляр, но любая эквивалентная копия) всегда будет возвращать элементы в том же порядке. Порядок фиксирован - это просто не тот порядок, который человек легко понимает (например, буквенный или порядок вставки). – kampu

0

Если я правильно Вас понял, это то, что вам нужно:

'~'.join(str(di.get(key)) for key in l if di.get(key) is not None)