2016-11-08 6 views
1

У меня есть список около 10000 элементов и для каждой пары элементов из этого списка у меня есть число. Мне нужно, чтобы все эти числа и комбинации в памяти вызывали его по обоим вариантам: comb(a,b) или comb(b,a).Выбор структуры данных python

Однако я не хочу дублировать значения в словаре или что-то в этом роде, потому что dict[a][b] = dict[b][a]. Не могли бы вы посоветовать мне структуру данных без дублирования?

+0

может быть '' set' из frozenset's ? 'set (frozenset ([a, b, comb (a, b)]), ...)' –

+0

Применение фильтров к кадру данных pandas должно делать трюк. http://pandas.pydata.org/pandas-docs/version/0.18.1/generated/pandas.DataFrame.filter.html –

+0

Можете ли вы получить доступ к комбинациям с использованием индексов вместо фактических значений? например, если у вас есть список a = [1,2,3,4], то вместо поиска гребня (2,4) вы можете использовать гребень (1,3), т. е. индексы? – Shasha99

ответ

4

Я предлагаю вам пойти с frozenset. Другие документы: https://docs.python.org/2/library/stdtypes.html#frozenset

Таким образом, вы будете иметь Dict, где frozensets будет выступать в качестве ключей (обратите внимание, что вы не можете использовать обычный набор, так как она изменчива и не может выступать в качестве словаря ключ). Frozenset неупорядочен, поэтому он идеально подходит для ваших нужд. Единственное ограничение состоит в том, что вы не можете дублировать элементы - frozenset - это неупорядоченная последовательность уникальных элементов.

Так что ваш ДИКТ будет выглядеть так:

pairs = { 
frozenset(['a', 'b']): 4 
.... 
} 

и вызов pairs[frozenset(['a', 'b'])] равно pairs[frozenset(['b', 'a'])]

UPD: Я действительно поторопиться на первой, так сделал несколько опечаток. Фиксированные их теперь :)

0

Примечание: Я предполагаю, что значения в списке являются уникальными и у вас есть возможность использовать индексы фактических значений (или вы готовы жертвовать время)

Если вы действительно хочу сэкономить место, я бы предложил вам использовать список списков для хранения значений для каждой комбинации. На самом деле вам не нужно хранить сопоставление (a, b) -> x.

Например, рассмотрим список:

a = [1,2,3,4] 

Пусть выполнены Комбинации/пары значений являются:

(1,2) -> 2, (1,3) -> 3, (1,4) -> 4, (2,3) -> 5, (2,4) -> 6, (3,4) -> 7 

Хранение для пары сочетание/значение будет выглядеть следующим образом:

comb_value = [[2,3,4],[5,6],[7]] 

Извлечение:

Предполагая, что список и comb_value являются глобальными. (Мы высохнет запустить код одновременно.)

# Consider that x=2 and y=4. 
def comb(x,y): 
    # if you can use index directly, next 2 lines should be skipped. 
    x= find_index(x) # Returns 1. 
    y= find_index(y) # Returns 3. 
    if x < y : 
     return _comb(x,y) # calling _comb(1,3) 
    return _comb(y,x) 

# x= 1 and y =3 
def _comb(x,y): 
    return comb_value[x][y-x-1] # returns comb_value[1][3-1] i.e. 6. 
0
d = {} 
d[('a', 'b')] = 12 
d[('y', 'z')] = 34 

и функция для извлечения

def fetch(a, b): 
    return d.get((a, b)) if (a, b) in d else d.get((b, a), None) 

выход:

In [16]: 
fetch('b', 'a') 
Out[16]: 
12 

In [17]: 
fetch('y', 'z') 
Out[17]: 
34 

In [19]: 
fetch('z', 'y') 
Out[19]: 
34 

In [20]: 
fetch('m', 'n') 
Смежные вопросы