简体   繁体   中英

Python: Alternate sorting of chunks in a list

Create a list (*for example, the size of 40 items) and fill it with random items.

Sort the list by 10 elements. That is, sort the first 10 elements in ascending order, the second ten elements in descending order, the third ten elements in ascending order, and the fourth in descending order.

The answer must be returned in one list!!!

*example - meaning that this is an approximate version of the size of the list, and you need to write an algorithm that can sort a list of any size.

from random import randint

list_1 = [randint(1, 100) for i in range(30)]


first_part = list_1[:10]
first_part.sort()
second_part = list_1[10:20]
second_part.sort(reverse=True)
third_part = list_1[20:30]
third_part.sort()

print(first_part + second_part + third_part)

I dont understand how to write an algorithm that can sort a list of any size.

One method by which this can be accomplished is by iterating the list of data in (n) size chunks, then calling the sorted function with the reverse parameter with either a value of 0 or 1, which is derived by the odd/even value of the iteration.

For example:

import random

data = [random.randint(1, 100) for _ in range(30)]

out = []
for idx, chunk in enumerate(range(0, len(data), 10)):
    out.extend(sorted(data[chunk:chunk+10], reverse=idx%2))

Output:

[6, 10, 16, 24, 26, 50, 57, 72, 94, 94,   # asc
 88, 82, 59, 44, 25, 22, 20, 19, 14, 9,   # desc
 16, 18, 29, 37, 45, 45, 76, 84, 93, 93]  # asc

You could sort the whole list with one call to sorted with a key callback that produces a tuple with the following members:

  • the "bucket": the sequence number of the sublist to sort, ie the index of the element divided by 10
  • the value to be sorted in ascending order within that bucket, ie either the value itself (for even buckets), or its negated value (for odd buckets)

Implementation:

def order(pair):
    i, val = pair
    bucket = i // 10
    return bucket, -val if bucket % 2 else val

lst = [randint(1, 100) for i in range(30)]

result = [val for _, val in sorted(enumerate(lst), key=order)]

You can try something like this :-

from random import randint

list_1 = [randint(1, 100) for i in range(30)]
print(list_1)

final_list = []

for i in range(0, len(list_1), 10):
    buf = list_1[i:i+10]
    buf.sort()
    for each in buf : final_list.append(each)

print(final_list)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM