Попытка кодирования сложного алгоритма с помощью структуры данных `OrderedDict` - PullRequest
5 голосов
/ 18 февраля 2020

Я пытаюсь написать алгоритм:

У меня есть этот тип данных OrderedDict, подобный следующему:

odict_items([(3, [(0, 1), (1, 1), (1, 1)]), (11, [(0, 0), (1, 1), (1, 1)]), (12, [(0, 0), (1, 1), (1, 1)])])

Я пытаюсь написать функцию для добавления количество одинаковых кортежей в каждом key, например, ожидаемый результат, например, следующий: если есть (1,1) такой же кортеж, то 1 и если вдвое больше 2 и так один:

odict_items([(3, [(0, 1), (1, 1), (1, 1)],2), (11, [(0, 0), (1, 1), (1, 1)],2), (12, [(0, 0), (1, 0), (1, 1)]),1])

это моя попытка, но как ее улучшить и добавить в OrderedDict?

def foo(OrderedDict):
    listOfDic = list(makeDataStruc().items())
    tupleCounter = 0
    for i in range(len(listOfDic[1])):
        if listOfDic[1][1][i][0] == 1 and listOfDic[1][1][i][1] == 1:
            tupleCounter += 1
    return tupleCounter

Где я делаю ошибку?

1 Ответ

0 голосов
/ 18 февраля 2020

Я делаю следующие предположения:

  • Вы просто хотите добавить счет (1,1) к значению OrderedDict
  • Вы не хотите создавать новая структура данных, которая переопределяет текущую OrderedDict.
  • . Вы можете изменить исходный словарь

Теперь, основываясь на информации, доступной в вопросе, и вышеупомянутых предположениях, одно из возможных решений можно заменить каждое значение списком, содержащим два элемента, то есть `[исходное значение, число (1, 1)]

from collections import OrderedDict

odict_items = [(3, [(0, 1), (1, 1), (1, 1)]),
               (11, [(0, 0), (1, 1), (1, 1)]),
               (12, [(0, 0), (1, 1), (1, 1)])]

my_odict = OrderedDict()

for item in odict_items:
    k, v = item
    my_odict[k] = v

Теперь посчитайте вхождение (1,1) в каждом значении и обновите значения соответственно

pattern_to_find = (1, 1)

for key, value in my_odict.items():
    tuple_count = value.count(pattern_to_find)
    new_value = [value, tuple_count]
    my_odict[key] = new_value

Теперь словарь имеет следующее содержимое:

OrderedDict([(3, [[(0, 1), (1, 1), (1, 1)], 2]),
             (11, [[(0, 0), (1, 1), (1, 1)], 2]),
             (12, [[(0, 0), (1, 1), (1, 1)], 2])])

Теперь вы можете создать дополнительную функцию для доступа только к значению или количеству кортежей

# Returns the count of (1, 1) only
def get_count(my_dict, key):
    return my_dict[key][1]

# Return the original value only
def get_tuple(my_dict, key):
    return my_dict[key][0]

Так что вы можете использовать их вот так

print(my_odict[3])
# [[(0, 1), (1, 1), (1, 1)], 2]

print(get_count(my_odict,3))
# 2

print(get_tuple(my_odict, 3))
# [(0, 1), (1, 1), (1, 1)]
...