Сортировать список строк численно и фильтровать дубликаты? - PullRequest
0 голосов
/ 15 февраля 2020

Имеется список строк в следующем формате:

[
    "464782,-100,4,3,1,100,0,0"
    "465042,-166.666666666667,4,3,1,100,0,0",
    "465825,-250.000000000001,4,3,1,100,0,0",
    "466868,-166.666666666667,4,3,1,100,0,0",
    "467390,-200.000000000001,4,3,1,100,0,0",
    "469999,-100,4,3,1,100,0,0",
    "470260,-166.666666666667,4,3,1,100,0,0",
    "474173,-100,4,3,1,100,0,0",
    "474434,-166.666666666667,4,3,1,100,0,0",
    "481477,-100,4,3,1,100,0,1",
    "531564,259.011439671919,4,3,1,60,1,0",
    "24369,-333.333333333335,4,3,1,100,0,0",
    "21082,410.958904109589,4,3,1,60,1,0",
    "21082,-250,4,3,1,100,0,0",
    "22725,-142.857142857143,4,3,1,100,0,0",
    "23547,-166.666666666667,4,3,1,100,0,0",
    "24369,-333.333333333335,4,3,1,100,0,0",
    "27657,-200.000000000001,4,3,1,100,0,0",
    "29301,-142.857142857143,4,3,1,100,0,0",
    "30123,-166.666666666667,4,3,1,100,0,0",
    "30945,-250,4,3,1,100,0,0",
    "32588,-166.666666666667,4,3,1,100,0,0",
    "34232,-250,4,3,1,100,0,0",
    "35876,-142.857142857143,4,3,1,100,0,0",
    "36698,-166.666666666667,4,3,1,100,0,0",
    "37520,-250,4,3,1,100,0,0",
    "42451,-142.857142857143,4,3,1,100,0,0",
    "43273,-166.666666666667,4,3,1,100,0,0",
]

Как отсортировать список по первому числу в каждой строке с python? А затем, после сортировки, удалите все дубликаты, если они есть?

Критерием сортировки списка является число перед первой запятой в каждой строке, которое всегда является целым числом.

Я попытался использовать list.sort (), однако, это сортирует элементы в лексическом порядке, а не по номерам.

Ответы [ 4 ]

3 голосов
/ 15 февраля 2020

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

l = ['464782,-100,4,3,1,100,0,0',
'465042,-166.666666666667,4,3,1,100,0,0',
'465825,-250.000000000001,4,3,1,100,0,0',
'466868,-166.666666666667,4,3,1,100,0,0',
'467390,-200.000000000001,4,3,1,100,0,0',
...]

d = {int(s.split(',')[0]) : s for s in l}
result = [d[key] for key in sorted(d.keys())]
1 голос
/ 15 февраля 2020

Вы можете попробовать это.

Сначала нам нужно удалить дубликаты внутри списка, используя set ()

removed_duplicates_list = list(set(listr))

Затем мы преобразуем список строк в список кортежей.

list_of_tuples = [tuple(i.split(",")) for i in removed_duplicates_list]

Затем мы сортируем его, используя sort ()

list_of_tuples.sort()

Полный пример кода ниже:

listr = [
    "464782,-100,4,3,1,100,0,0"
    "465042,-166.666666666667,4,3,1,100,0,0",
    "465825,-250.000000000001,4,3,1,100,0,0",
    "466868,-166.666666666667,4,3,1,100,0,0",
    "467390,-200.000000000001,4,3,1,100,0,0",
    "469999,-100,4,3,1,100,0,0",
    "470260,-166.666666666667,4,3,1,100,0,0",
    "474173,-100,4,3,1,100,0,0",
    "474434,-166.666666666667,4,3,1,100,0,0",
    "481477,-100,4,3,1,100,0,1",
    "531564,259.011439671919,4,3,1,60,1,0",
    "24369,-333.333333333335,4,3,1,100,0,0",
    "21082,410.958904109589,4,3,1,60,1,0",
    "21082,-250,4,3,1,100,0,0",
    "22725,-142.857142857143,4,3,1,100,0,0",
    "23547,-166.666666666667,4,3,1,100,0,0",
    "24369,-333.333333333335,4,3,1,100,0,0",
    "27657,-200.000000000001,4,3,1,100,0,0",
    "29301,-142.857142857143,4,3,1,100,0,0",
    "30123,-166.666666666667,4,3,1,100,0,0",
    "30945,-250,4,3,1,100,0,0",
    "32588,-166.666666666667,4,3,1,100,0,0",
    "34232,-250,4,3,1,100,0,0",
    "35876,-142.857142857143,4,3,1,100,0,0",
    "36698,-166.666666666667,4,3,1,100,0,0",
    "37520,-250,4,3,1,100,0,0",
    "42451,-142.857142857143,4,3,1,100,0,0",
    "43273,-166.666666666667,4,3,1,100,0,0",
]

removed_duplicates_list = list(set(listr))
list_of_tuples = [tuple(i.split(",")) for i in removed_duplicates_list]
list_of_tuples.sort()
print(list_of_tuples) # the output is a list of tuples

ВЫХОД:

    [('21082', '-250', '4', '3', '1', '100', '0', '0'),
    ('21082', '410.958904109589', '4', '3', '1', '60', '1', '0'),
    ('22725', '-142.857142857143', '4', '3', '1', '100', '0', '0'),
    ('23547', '-166.666666666667', '4', '3', '1', '100', '0', '0'),
    ('24369', '-333.333333333335', '4', '3', '1', '100', '0', '0'),
    ('27657', '-200.000000000001', '4', '3', '1', '100', '0', '0'),
    ('29301', '-142.857142857143', '4', '3', '1', '100', '0', '0'),
    ('30123', '-166.666666666667', '4', '3', '1', '100', '0', '0'),
    ('30945', '-250', '4', '3', '1', '100', '0', '0'),
    ('32588', '-166.666666666667', '4', '3', '1', '100', '0', '0'),
    ('34232', '-250', '4', '3', '1', '100', '0', '0'),
    ('35876', '-142.857142857143', '4', '3', '1', '100', '0', '0'),
    ('36698', '-166.666666666667', '4', '3', '1', '100', '0', '0'),
    ('37520', '-250', '4', '3', '1', '100', '0', '0'),
    ('42451', '-142.857142857143', '4', '3', '1', '100', '0', '0'),
    ('43273', '-166.666666666667', '4', '3', '1', '100', '0', '0'),  
    ('464782','-100','4','3','1','100','0'),
    ('465042','-166.666666666667','4','3','1','100','0','0'),
    ('465825', '-250.000000000001', '4', '3', '1', '100', '0', '0'),
    ('466868', '-166.666666666667', '4', '3', '1', '100', '0', '0'),
    ('467390', '-200.000000000001', '4', '3', '1', '100', '0', '0'),
    ('469999', '-100', '4', '3', '1', '100', '0', '0'),
    ('470260', '-166.666666666667', '4', '3', '1', '100', '0', '0'),
    ('474173', '-100', '4', '3', '1', '100', '0', '0'),
    ('474434', '-166.666666666667', '4', '3', '1', '100', '0', '0'),
    ('481477', '-100', '4', '3', '1', '100', '0', '1'),
    ('531564', '259.011439671919', '4', '3', '1', '60', '1', '0')]
1 голос
/ 15 февраля 2020

Я бы попробовал один из этих двух методов:

def sort_list(lis):
    nums = [int(num) if isdigit(num) else float(num) for num in lis]

    nums = list(set(nums))
    nums.sort()

    return [str(i) for i in nums]  # I assumed you wanted them to be strings.

Первый вызовет TypeError, если все элементы в lis не ints, floats или строковые представления число. Второй метод не имеет этой проблемы, но он немного сложнее.

def sort_list(lis):
    ints = [int(num) for num in lis if num.isdigit()]
    floats = [float(num) for num in lis if not num.isdigit()]

    nums = ints.copy()
    nums.extend(floats)
    nums = list(set(nums))
    nums.sort()

    return [str(i) for i in nums]  # I assumed you wanted them to be strings.

Надеюсь, это поможет.

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

Надеюсь, это поможет. Я помещаю все ваши элементы списка в отдельный файл с именем lista.txt . В этом примере я получу ваш список из файла ... Мне нравится быть более организованным и иметь отдельные файлы, в которых вы можете делать python, но идея в том, что вам нужно получать все элементы из списка один за другим (, в то время как функция или для функция) и добавлять их во временный список, проверяя, если новые элементы уже существуют, если они существуют, передайте, а затем вы можете использовать .sort () , потому что с этим справитесь и с числами.

# Global variables
file = "lista.txt"
tempList = []

# Logic get items from file
def GetListFromFile(fileName):
    # Local variables
    showDoneMsg = True

    # Try to run this code
    try:
        # Open file and try to read it
        with open(fileName, mode="r") as f:
            # Define line
            line = f.readline()
            # For every line in file
            while line:
                # Get out all end white space (\n, \r)
                item = line.rstrip()

                # Check if this item is not allready in the list
                if item not in tempList:
                    # Append item to a temporar list
                    tempList.append(item)
                # Show me if a itmes allready exist
                else:
                    print("Dublicate >>", item)

                # Go to new line
                line = f.readline()
        # This is optional because is callet automatical
        # but I like to be shore
        f.close()

    # Execptions
    except FileNotFoundError:
        print("ERROR >> File do not exist!")
        showDoneMsg = False

    # Sort the list
    tempList.sort()
    # Show me when is done if file exist
    if showDoneMsg == True:
        print("\n>>> DONE <<<\n")

# Logic show list items
def ShowListItems(thisList):
    if len(thisList) == 0:
        print("Temporary list is empty...")
    else:
        print("This is new items list:")
        for i in thisList:
            print(i)

# Execute function
GetListFromFile(file)
# Testing if items was sorted
ShowListItems(tempList)

Out put:

========================= RESTART: D:\Python\StackOverflow\help.py =========================
Dublicate >> 43273,-166.666666666667,4,3,1,100,0,0

>>> DONE <<<

21082,-250,4,3,1,100,0,0
21082,410.958904109589,4,3,1,60,1,0
22725,-142.857142857143,4,3,1,100,0,0
...
474434,-166.666666666667,4,3,1,100,0,0
481477,-100,4,3,1,100,0,1
531564,259.011439671919,4,3,1,60,1,0
>>> 
...