Выбрать элемент в списке значений в словаре - PullRequest
1 голос
/ 04 апреля 2019

У меня есть словарь со списком значений из 2 или более элементов.Я хочу нарезать эти значения более чем на 2 элемента, основываясь на других значениях, содержащих только 2 элемента в своем списке.

Я знаю, что могу добавить все элементы значений в список, а затем просто посчитать наиболее распространенные, но мне нужно сохранить информацию, касающуюся ключа и формата словаря, чтобы он действительно не работал.И я не могу понять, как решить эту проблему.

Мой словарь такой:

start_dict = {
    'Key1': [243928620, 243938319],
    'Key2': [243928620, 243938319],
    'Key3': [243928620, 243931757, 243938319],
    'Key4': [243928620, 243938319, 243938323],
    'Key5': [243928634, 243938316],
    'Key6': [243928620, 243938319],
    'Key7': [243928634, 243938317],
    'Key8': [243928620, 243938329,243938387]
}

Я хочу оставить элемент 1 во всем списке значений неизменным, так как это началокоордината, а остальное - потенциальные конечные координаты для данного интервала.

Затем для тех значений, в списке которых более 2 элементов (key3, 4 и 8), я хочу сохранить этот элемент в списке значенийкоторый наиболее часто встречается в других списках значений для других ключей, что имеет место для ключей 3 и 4, так как они оба содержат наиболее частую конечную координату 243938319.

Если они отсутствуют ни в одном изв противном случае я просто оставлю их, как в случае с ключом 8.

Значения, наиболее часто встречающиеся из всех ключей, относятся к начальной позиции 243928620 и к конечной позиции 243938319. Таким образом, идеальный результат будет

start_dict = {
    'Key1': [243928620, 243938319],
    'Key2': [243928620, 243938319],
    'Key3': [243928620, 243938319],
    'Key4': [243928620, 243938319],
    'Key5': [243928634, 243938316],
    'Key6': [243928620, 243938319],
    'Key7': [243928634, 243938317],
    'Key8': [243928620, 243938329,243938387]
}

Кажется, я не могу понять, как это можно сделать, даже если это можно сделать с умом.

Кто-нибудь из вас сможет помочь?Спасибо за ваше время.

Ответы [ 3 ]

2 голосов
/ 04 апреля 2019

Это способ сделать это:

from collections import Counter
from pprint import pprint

def reduce_coords(data):
    # Counter of second list element for 2-element lists
    count = Counter(v[1] for v in data.values() if len(v) == 2)
    # Result dict
    result = {}
    # Iterate data entries
    for k, v in data.items():
        # Modify lists longer than two with at least one element in the counter
        if len(v) > 2 and any(elem in count for elem in v[1:]):
            # Replace list with first element and following element with max count
            v = [v[0], max(v[1:], key=lambda elem: count.get(elem, 0))]
        # Add to result
        result[k] = v
    return result

start_dict = {
    'Key1': [243928620, 243938319],
    'Key2': [243928620, 243938319],
    'Key3': [243928620, 243931757, 243938319],
    'Key4': [243928620, 243938319, 243938323],
    'Key5': [243928634, 243938316],
    'Key6': [243928620, 243938319],
    'Key7': [243928634, 243938317],
    'Key8': [243928620, 243938329,243938387]
}
pprint(reduce_coords(start_dict))
# {'Key1': [243928620, 243938319],
#  'Key2': [243928620, 243938319],
#  'Key3': [243928620, 243938319],
#  'Key4': [243928620, 243938319],
#  'Key5': [243928634, 243938316],
#  'Key6': [243928620, 243938319],
#  'Key7': [243928634, 243938317],
#  'Key8': [243928620, 243938329, 243938387]}
1 голос
/ 04 апреля 2019

Что касается другой структуры для хранения этой информации:

start_dict = {
    'Key1': [243928620, 243938319],
    'Key2': [243928620, 243938319],
    'Key3': [243928620, 243931757, 243938319],
    'Key4': [243928620, 243938319, 243938323],
    'Key5': [243928634, 243938316],
    'Key6': [243928620, 243938319],
    'Key7': [243928634, 243938317],
    'Key8': [243928620, 243938329,243938387]
}

modified_dict = {k:{"start":v[0], "end":v[1:]} for k, v in start_dict.items()}
print(modified_dict)
#Output:
{'Key1': {'start': 243928620, 'end': [243938319]},
 'Key2': {'start': 243928620, 'end': [243938319]},
 'Key3': {'start': 243928620, 'end': [243931757, 243938319]},
 'Key4': {'start': 243928620, 'end': [243938319, 243938323]},
 'Key5': {'start': 243928634, 'end': [243938316]},
 'Key6': {'start': 243928620, 'end': [243938319]},
 'Key7': {'start': 243928634, 'end': [243938317]},
 'Key8': {'start': 243928620, 'end': [243938329, 243938387]}}

Приведенные выше указания на диктовку могут дать более четкую картину как для использования, так и для поддержки, вы можете рассмотреть возможность использования такой структуры.В качестве альтернативы, возможно, также может работать кортеж 2 длины, но я считаю эту версию наиболее читаемой.

Принимая это как отправную точку:

#collect all possible end points for every key, and combine in a list
end_points = []
for k, v in modified_dict.items():
    end_points.extend(v["end"])

#find the most common end point
from collections import Counter
most_common = Counter(end_points).most_common(1)[0][0]

#Adjust the end points if the most common end point is found
for k, v in modified_dict.items():
    if most_common in v["end"]:
        modified_dict[k]["end"] = [most_common]
print(modified_dict)
#Output:
{'Key1': {'start': 243928620, 'end': [243938319]},
 'Key2': {'start': 243928620, 'end': [243938319]},
 'Key3': {'start': 243928620, 'end': [243938319]},
 'Key4': {'start': 243928620, 'end': [243938319]},
 'Key5': {'start': 243928634, 'end': [243938316]},
 'Key6': {'start': 243928620, 'end': [243938319]},
 'Key7': {'start': 243928634, 'end': [243938317]},
 'Key8': {'start': 243928620, 'end': [243938329, 243938387]}}
0 голосов
/ 04 апреля 2019

Я предпочитаю другой ответ, но это все же может научить вас кое-чему о понимании списка.

#

создайте список всех конечных точек:

startpoints = {k:v[0]  for k,v in start_dict.items()}
endpoints = {k:v[1:] for k,v in start_dict.items()}

Затем сгладьте его:

endpoints_flatten = [value for list in endpoints.values() for value in list]

создать счетчик со всеми конечными точками:

from collections import Counter
c = Counter(endpoints_flatten)

Создайте функцию, которая дает вам наиболее распространенные в списке:

def most_com(list_endpoint,c):
    return max(list_endpoint, key=lambda l : c[l])

Теперь просмотрите список конечных точек и оставьте только наиболее распространенный:

common_endpoint = {k:most_com(list_endpoint,c) for k,list_endpoint in endpoints.items()}

Теперь выведите все это:

output = {k:v + common_endpoint[k] for k,v in startpoints.items()}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...