Заказать словарь с координатами X и Y в Python - PullRequest
0 голосов
/ 18 октября 2019

У меня есть эта проблема.

Мне нужно заказать эти пункты 1-7 1 (4,2), 2 (3, 5), 3 (1,4), 4 (1,1), 5 (2,2), 6(1,3), 7 (1,5)

и получим этот результат 4, 6, 3, 5, 2, 1, 7.

enter image description here

Я использую скрипт на python для сортировки со ссылкой x и все в порядке, но сортировка по y неверна.

Я пробовал с сортировкой (dicts, key = itemgetter (1,2))

Кто-нибудь может мне помочь, пожалуйста?

Ответы [ 3 ]

2 голосов
/ 18 октября 2019

Попробуйте это:

sorted(dicts,key=itemgetter(1,0))

Индексирование в python начинается с 0. itemgetter(1,0) - сортировка по второму элементу, а затем по первому элементу

0 голосов
/ 19 октября 2019

Поскольку вы выполняете визуальный поиск сверху вниз, а затем слева направо, этот код намного проще и дает правильный результат. Он в основном делает эквивалент визуального сканирования, проверяя все кортежи, которые находятся в каждой позиции "y = n", а затем сортируя любые кортежи "y = n" на основе второго числа (слева направо).

Чтобы быть более совместимым с декартовой системой счисления, я преобразовал точки на графике в координаты (x, y), с X-положительным (увеличение вправо) и y-отрицательным (уменьшениекак они падают).

d = {(2,-4):1, (5,-3):2, (4,-1):3, (1,-1):4, (2,-2):5, (3,-1):6, (1,-5):7}
l = [(2,-4), (5,-3), (4,-1), (1,-1), (2,-2), (3,-1), (1,-5)]

results = []
# Use the length of the list. Its more than needed, but guarantees enough loops
for y in range(0, -len(l), -1):
    # For ONLY the items found at the specified y coordinate 
    temp_list = []
    for i in l: # Loop through ALL the items in the list
        if i[1] == y: # If tuple is at this "y" coordinate then...
            temp_list.append(i) # ... append it to the temp list
    # Now sort the list based on the "x" position of the coordinate
    temp_list = sorted(temp_list, key=lambda x: x[0])
    results += temp_list # And just append it to the final result list
# Final TUPLES in order
print(results)
# If you need them correlated to their original numbers
by_designator_num = []
for i in results: # The the first tupele value
    by_designator_num.append(d[i]) # Use the tuple value as the key, to get the original designator number from the original "d" dictionary
print(by_designator_num)

ИЛИ если вы хотите, чтобы он был быстрее и компактнее

d = {(2,-4):1, (5,-3):2, (4,-1):3, (1,-1):4, (2,-2):5, (3,-1):6, (1,-5):7}
l = [(2,-4), (5,-3), (4,-1), (1,-1), (2,-2), (3,-1), (1,-5)]

results = []
for y in range(0, -len(l), -1):
    results += sorted([i for i in l if i[1] == y ], key=lambda x: x[0])
print(results)

by_designator_num = [d[i] for i in results]
print(by_designator_num)

ВЫХОД:

[(1, -1), (3, -1), (4, -1), (2, -2), (5, -3), (2, -4), (1, -5)]
[4, 6, 3, 5, 2, 1, 7]
0 голосов
/ 19 октября 2019

Это сортирует код на основе упорядочения первой координаты кортежа, а затем переупорядочения по второй координате кортежа. Т.е. как в алфавитном порядке, где «Aa», затем «Ab», затем «Ba», затем «Bb». Больше literall (1,1), (1,2), (2,1), (2,2) и т. Д.

Это будет работать, ЕСЛИ (и только если) пара значений кортежа, связанная с #7 на самом деле не в порядке в вашем вопросе (и на самом деле должно быть между # 3 и # 5.)

Если это не так, см. Мой другой ответ.

# Make it a dictionary, with the VALUETUPLES  as the KEYS, and the designator as the value
d = {(1,1):4, (1,3):6, (1,4):3, (2,2):5, (3,5):2, (4,2):1,(1,5):7}
# ALSO make a list of just the value tuples
l = [ (1,1), (1,3), (1,4), (2,2), (3,5), (4,2), (1,5)]

# Sort the list by the first element in each tuple. ignoring the second
new = sorted(l, key=lambda x: x[0])

# Create a new dictionary, basically for temp sorting
new_d = {}
# This iterates through the first sorted list "new"
# and creates a dictionary where the key is the first number of value tuples
count = 0
# The extended range is because we don't know if any of the Tuple Values share any same numbers
for r in range(0, len(new)+1,1): 
    count += 1
    new_d[r] = []
    for item in new:
        if item[0] == r:
            new_d[r].append(item)

print(new_d) # So it makes sense

# Make a final list to capture the rdered TUPLES VALUES
final_list = []
# Go through the same rage as above
for r in range(0, len(new)+1,1):
    _list = new_d[r] # Grab the first list item from the dic. Order does not matter here
    if len(_list) > 0: # If the list has any values...
        # Sort that list now by the SECOND tuple value
        _list = sorted(_list, key=lambda x: x[1])
        # Lists are ordered. So we can now just tack that ordered list onto the final list. 
        # The order remains
        for item in _list: 
            final_list.append(item)

# This is all the tuple values in order
print(final_list)
# If you need them correlated to their original numbers
by_designator_num = []
for i in final_list: # The the first tupele value
    by_designator_num.append(d[i]) # Use the tuple value as the key, to get the original designator number from the original "d" dictionary

print(by_designator_num)

ВЫХОД:

[(1, 1), (1, 3), (1, 4), (1, 5), (2, 2), (3, 5), (4, 2)]
[4, 6, 3, 7, 5, 2, 1]              
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...