Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Sort sets by item values
#1
Good day!

In Python, a beginner, so I apologize in advance, if not correct, I will describe something.

There are set, for example:
{'permit tcp host 192.168.23.6 host 192.168.2.31 eq 445', 'permit tcp host 192.168.23.5 host 192.168.2.31 eq 135', 'permit udp host 192.168.23.2 host 192.168.2.32 eq 53', 'permit tcp host 192.168.23.5 host 192.168.2.26 eq 49749', 'permit tcp host 192.168.23.4 host 192.168.2.23 eq 80', 'permit tcp host 192.168.23.2 host 192.168.2.32 eq 445', 'permit tcp host 192.168.23.9 host 192.168.2.31 eq 445', 'permit udp host 192.168.23.5 host 192.168.2.32 eq 53', 'permit udp host 192.168.23.7 host 192.168.2.31 eq 53', 'permit tcp host 192.168.23.5 host 192.168.2.32 eq 389', 'permit tcp host 192.168.23.9 host 192.168.2.26 eq 49749', 'permit tcp host 192.168.23.7 host 192.168.2.32 eq 49670', 'permit udp host 192.168.23.5 host 192.168.2.31 eq 53', 'permit udp host 192.168.23.7 host 192.168.2.32 eq 53', 'permit udp host 192.168.23.9 host 192.168.2.32 eq 53', 'permit tcp host 192.168.23.6 host 192.168.2.23 eq 80', 'permit udp host 192.168.23.3 host 192.168.2.31 eq 53', 'permit udp host 192.168.23.5 host 192.168.2.32 eq 389', 'permit tcp host 192.168.23.9 host 192.168.2.31 eq 135', 'permit udp host 192.168.23.5 host 192.168.2.32 eq 123', 'permit udp host 192.168.23.1 host 192.168.2.32 eq 53', 'permit tcp host 192.168.23.1 host 192.168.2.23 eq 80', 'permit tcp host 192.168.23.8 host 192.168.2.23 eq 80', 'permit tcp host 192.168.23.1 host 192.168.2.32 eq 135', 'permit udp host 192.168.23.2 host 192.168.2.31 eq 53', 'permit udp host 192.168.23.6 host 192.168.2.31 eq 389', 'permit tcp host 192.168.23.3 host 192.168.2.32 eq 445', 'permit tcp host 192.168.23.2 host 192.168.2.28 eq 445', 'permit tcp host 192.168.23.7 host 192.168.2.23 eq 8530', 'permit tcp host 192.168.23.4 host 192.168.2.32 eq 88', 'permit udp host 192.168.23.9 host 192.168.2.31 eq 389', 'permit tcp host 192.168.23.5 host 192.168.2.31 eq 88', 'permit udp host 192.168.23.8 host 192.168.2.31 eq 389', 'permit udp host 192.168.23.8 host 192.168.2.32 eq 389', 'permit tcp host 192.168.23.2 host 192.168.2.23 eq 80', 'permit tcp host 192.168.23.6 host 192.168.2.31 eq 389', 'permit udp host 192.168.23.1 host 192.168.2.32 eq 389', 'permit tcp host 192.168.23.2 host 192.168.2.26 eq 49749', 'permit tcp host 192.168.23.5 host 192.168.2.32 eq 135', 'permit tcp host 192.168.23.5 host 192.168.2.23 eq 8530', 'permit tcp host 192.168.23.1 host 192.168.2.32 eq 445', 'permit udp host 192.168.23.8 host 192.168.2.31 eq 53', 'permit tcp host 192.168.23.1 host 192.168.2.23 eq 8530', 'permit tcp host 192.168.23.3 host 192.168.2.23 eq 80', 'permit tcp host 192.168.23.9 host 192.168.2.31 eq 389', 'permit udp host 192.168.23.9 host 192.168.2.31 eq 53', 'permit tcp host 192.168.23.6 host 192.168.2.31 eq 135', 'permit tcp host 192.168.23.2 host 192.168.2.23 eq 8530', 'permit udp host 192.168.23.6 host 192.168.2.31 eq 53', 'permit udp host 192.168.23.4 host 192.168.2.32 eq 389', 'permit udp host 192.168.23.1 host 192.168.2.31 eq 53', 'permit tcp host 192.168.23.7 host 192.168.2.32 eq 445', 'permit tcp host 192.168.23.4 host 192.168.2.31 eq 135', 'permit tcp host 192.168.23.5 host 192.168.2.23 eq 80', 'permit tcp host 192.168.23.1 host 192.168.2.31 eq 445', 'permit tcp host 192.168.23.5 host 192.168.2.31 eq 389', 'permit udp host 192.168.23.4 host 192.168.2.31 eq 53', 'permit tcp host 192.168.23.5 host 192.168.2.28 eq 445', 'permit udp host 192.168.23.3 host 192.168.2.32 eq 53', 'permit udp host 192.168.23.4 host 192.168.2.32 eq 53', 'permit tcp host 192.168.23.5 host 192.168.2.32 eq 49670', 'permit tcp host 192.168.23.8 host 192.168.2.31 eq 389', 'permit tcp host 192.168.23.8 host 192.168.2.32 eq 445', 'permit tcp host 192.168.23.8 host 192.168.2.31 eq 49667', 'permit tcp host 192.168.23.4 host 192.168.2.31 eq 445', 'permit udp host 192.168.23.8 host 192.168.2.32 eq 53', 'permit tcp host 192.168.23.5 host 192.168.2.32 eq 445', 'permit tcp host 192.168.23.4 host 192.168.2.32 eq 445', 'permit tcp host 192.168.23.5 host 192.168.2.28 eq 135', 'permit tcp host 192.168.23.4 host 192.168.2.31 eq 49667', 'permit tcp host 192.168.23.7 host 192.168.2.23 eq 80', 'permit tcp host 192.168.23.1 host 192.168.2.32 eq 49670', 'permit tcp host 192.168.23.9 host 192.168.2.23 eq 80', 'permit udp host 192.168.23.6 host 192.168.2.32 eq 53'}
I need to sort it by the values inside the elements. The output does not have to be set, just to display the result line by line.

For example, let's take 'permit udp host 192.168.23.6 host 192.168.2.32 eq 53'. You must first sort by 53, then by 192.168.2.32, then by 192.168.23.6. I do not even understand in which direction to move.

I thought of using split for separating each element and subsequent analysis, but it seems to me that it is very cumbersome and there must be some longer beautiful solution.
Reply
#2
Using sorted with a key function to obtain the eq value

Edit: added 2nd and 3rd sorting, not sure if 2nd and 3rd sorting key is how you want it

values = {'permit tcp host 192.168.23.6 host 192.168.2.31 eq 445',
          'permit tcp host 192.168.23.5 host 192.168.2.31 eq 135',
          'permit udp host 192.168.23.2 host 192.168.2.32 eq 53',
          'permit tcp host 192.168.23.5 host 192.168.2.26 eq 49749',
          'permit tcp host 192.168.23.4 host 192.168.2.23 eq 80',
          'permit tcp host 192.168.23.2 host 192.168.2.32 eq 445',
          'permit tcp host 192.168.23.9 host 192.168.2.31 eq 445',
          'permit udp host 192.168.23.5 host 192.168.2.32 eq 53',
          'permit udp host 192.168.23.7 host 192.168.2.31 eq 53',
          'permit tcp host 192.168.23.5 host 192.168.2.32 eq 389',
          'permit tcp host 192.168.23.9 host 192.168.2.26 eq 49749',
          'permit tcp host 192.168.23.7 host 192.168.2.32 eq 49670',
          'permit udp host 192.168.23.5 host 192.168.2.31 eq 53',
          'permit udp host 192.168.23.7 host 192.168.2.32 eq 53',
          'permit udp host 192.168.23.9 host 192.168.2.32 eq 53',
          'permit tcp host 192.168.23.6 host 192.168.2.23 eq 80',
          'permit udp host 192.168.23.3 host 192.168.2.31 eq 53',
          'permit udp host 192.168.23.5 host 192.168.2.32 eq 389',
          'permit tcp host 192.168.23.9 host 192.168.2.31 eq 135',
          'permit udp host 192.168.23.5 host 192.168.2.32 eq 123',
          'permit udp host 192.168.23.1 host 192.168.2.32 eq 53',
          'permit tcp host 192.168.23.1 host 192.168.2.23 eq 80',
          'permit tcp host 192.168.23.8 host 192.168.2.23 eq 80',
          'permit tcp host 192.168.23.1 host 192.168.2.32 eq 135',
          'permit udp host 192.168.23.2 host 192.168.2.31 eq 53',
          'permit udp host 192.168.23.6 host 192.168.2.31 eq 389',
          'permit tcp host 192.168.23.3 host 192.168.2.32 eq 445',
          'permit tcp host 192.168.23.2 host 192.168.2.28 eq 445',
          'permit tcp host 192.168.23.7 host 192.168.2.23 eq 8530',
          'permit tcp host 192.168.23.4 host 192.168.2.32 eq 88',
          'permit udp host 192.168.23.9 host 192.168.2.31 eq 389',
          'permit tcp host 192.168.23.5 host 192.168.2.31 eq 88',
          'permit udp host 192.168.23.8 host 192.168.2.31 eq 389',
          'permit udp host 192.168.23.8 host 192.168.2.32 eq 389',
          'permit tcp host 192.168.23.2 host 192.168.2.23 eq 80',
          'permit tcp host 192.168.23.6 host 192.168.2.31 eq 389',
          'permit udp host 192.168.23.1 host 192.168.2.32 eq 389',
          'permit tcp host 192.168.23.2 host 192.168.2.26 eq 49749',
          'permit tcp host 192.168.23.5 host 192.168.2.32 eq 135',
          'permit tcp host 192.168.23.5 host 192.168.2.23 eq 8530',
          'permit tcp host 192.168.23.1 host 192.168.2.32 eq 445',
          'permit udp host 192.168.23.8 host 192.168.2.31 eq 53',
          'permit tcp host 192.168.23.1 host 192.168.2.23 eq 8530',
          'permit tcp host 192.168.23.3 host 192.168.2.23 eq 80',
          'permit tcp host 192.168.23.9 host 192.168.2.31 eq 389',
          'permit udp host 192.168.23.9 host 192.168.2.31 eq 53',
          'permit tcp host 192.168.23.6 host 192.168.2.31 eq 135',
          'permit tcp host 192.168.23.2 host 192.168.2.23 eq 8530',
          'permit udp host 192.168.23.6 host 192.168.2.31 eq 53',
          'permit udp host 192.168.23.4 host 192.168.2.32 eq 389',
          'permit udp host 192.168.23.1 host 192.168.2.31 eq 53',
          'permit tcp host 192.168.23.7 host 192.168.2.32 eq 445',
          'permit tcp host 192.168.23.4 host 192.168.2.31 eq 135',
          'permit tcp host 192.168.23.5 host 192.168.2.23 eq 80',
          'permit tcp host 192.168.23.1 host 192.168.2.31 eq 445',
          'permit tcp host 192.168.23.5 host 192.168.2.31 eq 389',
          'permit udp host 192.168.23.4 host 192.168.2.31 eq 53',
          'permit tcp host 192.168.23.5 host 192.168.2.28 eq 445',
          'permit udp host 192.168.23.3 host 192.168.2.32 eq 53',
          'permit udp host 192.168.23.4 host 192.168.2.32 eq 53',
          'permit tcp host 192.168.23.5 host 192.168.2.32 eq 49670',
          'permit tcp host 192.168.23.8 host 192.168.2.31 eq 389',
          'permit tcp host 192.168.23.8 host 192.168.2.32 eq 445',
          'permit tcp host 192.168.23.8 host 192.168.2.31 eq 49667',
          'permit tcp host 192.168.23.4 host 192.168.2.31 eq 445',
          'permit udp host 192.168.23.8 host 192.168.2.32 eq 53',
          'permit tcp host 192.168.23.5 host 192.168.2.32 eq 445',
          'permit tcp host 192.168.23.4 host 192.168.2.32 eq 445',
          'permit tcp host 192.168.23.5 host 192.168.2.28 eq 135',
          'permit tcp host 192.168.23.4 host 192.168.2.31 eq 49667',
          'permit tcp host 192.168.23.7 host 192.168.2.23 eq 80',
          'permit tcp host 192.168.23.1 host 192.168.2.32 eq 49670',
          'permit tcp host 192.168.23.9 host 192.168.2.23 eq 80',
          'permit udp host 192.168.23.6 host 192.168.2.32 eq 53'}


def sort_key(item):
    rest, eq = item.split('eq')
    _, ip1, ip2 = rest.split('host')
    ip1 = tuple(int(i) for i in ip1.split('.'))
    ip2 = tuple(int(i) for i in ip2.split('.'))
    return int(eq), ip2, ip1

print(sort_key('permit udp host 192.168.23.6 host 192.168.2.32 eq 53'))

sorted_values = sorted(values, key=sort_key)
 
print(sorted_values)
Output:
(53, (192, 168, 2, 32), (192, 168, 23, 6)) ['permit udp host 192.168.23.1 host 192.168.2.31 eq 53', 'permit udp host 192.168.23.2 host 192.168.2.31 eq 53', 'permit udp host 192.168.23.3 host 192.168.2.31 eq 53', 'permit udp host 192.168.23.4 host 192.168.2.31 eq 53', 'permit udp host 192.168.23.5 host 192.168.2.31 eq 53', 'permit udp host 192.168.23.6 host 192.168.2.31 eq 53', 'permit udp host 192.168.23.7 host 192.168.2.31 eq 53', 'permit udp host 192.168.23.8 host 192.168.2.31 eq 53', 'permit udp host 192.168.23.9 host 192.168.2.31 eq 53', 'permit udp host 192.168.23.1 host 192.168.2.32 eq 53', 'permit udp host 192.168.23.2 host 192.168.2.32 eq 53', 'permit udp host 192.168.23.3 host 192.168.2.32 eq 53', 'permit udp host 192.168.23.4 host 192.168.2.32 eq 53', 'permit udp host 192.168.23.5 host 192.168.2.32 eq 53', 'permit udp host 192.168.23.6 host 192.168.2.32 eq 53', 'permit udp host 192.168.23.7 host 192.168.2.32 eq 53', 'permit udp host 192.168.23.8 host 192.168.2.32 eq 53', 'permit udp host 192.168.23.9 host 192.168.2.32 eq 53', 'permit tcp host 192.168.23.1 host 192.168.2.23 eq 80', 'permit tcp host 192.168.23.2 host 192.168.2.23 eq 80', 'permit tcp host 192.168.23.3 host 192.168.2.23 eq 80', 'permit tcp host 192.168.23.4 host 192.168.2.23 eq 80', 'permit tcp host 192.168.23.5 host 192.168.2.23 eq 80', 'permit tcp host 192.168.23.6 host 192.168.2.23 eq 80', 'permit tcp host 192.168.23.7 host 192.168.2.23 eq 80', 'permit tcp host 192.168.23.8 host 192.168.2.23 eq 80', 'permit tcp host 192.168.23.9 host 192.168.2.23 eq 80', 'permit tcp host 192.168.23.5 host 192.168.2.31 eq 88', 'permit tcp host 192.168.23.4 host 192.168.2.32 eq 88', 'permit udp host 192.168.23.5 host 192.168.2.32 eq 123', 'permit tcp host 192.168.23.5 host 192.168.2.28 eq 135', 'permit tcp host 192.168.23.4 host 192.168.2.31 eq 135', 'permit tcp host 192.168.23.5 host 192.168.2.31 eq 135', 'permit tcp host 192.168.23.6 host 192.168.2.31 eq 135', 'permit tcp host 192.168.23.9 host 192.168.2.31 eq 135', 'permit tcp host 192.168.23.1 host 192.168.2.32 eq 135', 'permit tcp host 192.168.23.5 host 192.168.2.32 eq 135', 'permit tcp host 192.168.23.5 host 192.168.2.31 eq 389', 'permit udp host 192.168.23.6 host 192.168.2.31 eq 389', 'permit tcp host 192.168.23.6 host 192.168.2.31 eq 389', 'permit udp host 192.168.23.8 host 192.168.2.31 eq 389', 'permit tcp host 192.168.23.8 host 192.168.2.31 eq 389', 'permit udp host 192.168.23.9 host 192.168.2.31 eq 389', 'permit tcp host 192.168.23.9 host 192.168.2.31 eq 389', 'permit udp host 192.168.23.1 host 192.168.2.32 eq 389', 'permit udp host 192.168.23.4 host 192.168.2.32 eq 389', 'permit tcp host 192.168.23.5 host 192.168.2.32 eq 389', 'permit udp host 192.168.23.5 host 192.168.2.32 eq 389', 'permit udp host 192.168.23.8 host 192.168.2.32 eq 389', 'permit tcp host 192.168.23.2 host 192.168.2.28 eq 445', 'permit tcp host 192.168.23.5 host 192.168.2.28 eq 445', 'permit tcp host 192.168.23.1 host 192.168.2.31 eq 445', 'permit tcp host 192.168.23.4 host 192.168.2.31 eq 445', 'permit tcp host 192.168.23.6 host 192.168.2.31 eq 445', 'permit tcp host 192.168.23.9 host 192.168.2.31 eq 445', 'permit tcp host 192.168.23.1 host 192.168.2.32 eq 445', 'permit tcp host 192.168.23.2 host 192.168.2.32 eq 445', 'permit tcp host 192.168.23.3 host 192.168.2.32 eq 445', 'permit tcp host 192.168.23.4 host 192.168.2.32 eq 445', 'permit tcp host 192.168.23.5 host 192.168.2.32 eq 445', 'permit tcp host 192.168.23.7 host 192.168.2.32 eq 445', 'permit tcp host 192.168.23.8 host 192.168.2.32 eq 445', 'permit tcp host 192.168.23.1 host 192.168.2.23 eq 8530', 'permit tcp host 192.168.23.2 host 192.168.2.23 eq 8530', 'permit tcp host 192.168.23.5 host 192.168.2.23 eq 8530', 'permit tcp host 192.168.23.7 host 192.168.2.23 eq 8530', 'permit tcp host 192.168.23.4 host 192.168.2.31 eq 49667', 'permit tcp host 192.168.23.8 host 192.168.2.31 eq 49667', 'permit tcp host 192.168.23.1 host 192.168.2.32 eq 49670', 'permit tcp host 192.168.23.5 host 192.168.2.32 eq 49670', 'permit tcp host 192.168.23.7 host 192.168.2.32 eq 49670', 'permit tcp host 192.168.23.2 host 192.168.2.26 eq 49749', 'permit tcp host 192.168.23.5 host 192.168.2.26 eq 49749', 'permit tcp host 192.168.23.9 host 192.168.2.26 eq 49749']
Reply
#3
You want to sort by: (port, right_ip_address, left_ip_address)

Here is a key function to sort them.

import ipaddress


def ip_sorter(text):
    parts = text.split()
    port = int(parts[-1])
    addr1 = int(ipaddress.ip_address(parts[-3]))
    addr2 = int(ipaddress.ip_address(parts[3]))
    return port, addr1, addr2
Then call:
sorted(your_set, key=ip_sorter)
For each element in your_set, the key function is called with the element as argument.
The sorter grabs port, addr1 and addr2. addr1/2 are converted to an ip_address object, then it's converted to an integer.
The port must be also an integer.

finally the sorter returns a tuple with 3 integers. The sorted function uses this information to get the items in the right order.
Almost dead, but too lazy to die: https://sourceserver.info
All humans together. We don't need politicians!
Reply
#4
Thank you guys, very helpful!
DeaD_EyE, thanks for the explanation!
Reply
#5
I try additional sorting by tcp/udp before ip1 or addr2 like this
def sort_key(item):
    rest, eq = item.split('eq')
    protocol = item.split()[1]
    _, ip1, ip2 = rest.split('host')
    ip1 = tuple(int(i) for i in ip1.split('.'))
    ip2 = tuple(int(i) for i in ip2.split('.'))
    return int(eq), ip2, protocol, ip1
or like this
def ip_sorter(text):
    parts = text.split()
    protocol = parts[1]
    port = int(parts[-1])
    addr1 = int(ipaddress.ip_address(parts[-3]))
    addr2 = int(ipaddress.ip_address(parts[3]))
    return port, addr1, protocol, addr2
but it does not work.
What is a problem?
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  How to sort .csv file test log which item first fail and paint color SamLiu 24 4,845 Sep-03-2022, 07:32 AM
Last Post: Pedroski55
Photo a.sort() == b.sort() all the time 3lnyn0 1 1,312 Apr-19-2022, 06:50 PM
Last Post: Gribouillis
  Peculiar pattern from printing of sets SahandJ 7 1,642 Dec-29-2021, 06:31 PM
Last Post: bowlofred
  Remove an item from a list contained in another item in python CompleteNewb 19 5,690 Nov-11-2021, 06:43 AM
Last Post: Gribouillis
  How does one combine 2 data sets ? detlefschmitt 2 1,680 Sep-03-2021, 03:38 AM
Last Post: detlefschmitt
  How to sort values descending from a row in a dataframe using python sankarachari 1 1,416 Aug-16-2021, 08:55 AM
Last Post: jamesaarr
  Looping Through Large Data Sets JoeDainton123 10 4,365 Oct-18-2020, 02:58 PM
Last Post: buran
  comprehension for sets Skaperen 2 1,861 Aug-07-2020, 10:12 PM
Last Post: Skaperen
  Sort y axis by descening values matplotlib mrsenorchuck 0 3,795 Dec-08-2019, 08:13 PM
Last Post: mrsenorchuck
  sort lists of lists with multiple criteria: similar values need to be treated equal stillsen 2 3,262 Mar-20-2019, 08:01 PM
Last Post: stillsen

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020