自定义排序数组

时间:2017-04-25 00:55:06

标签: java python arrays sorting

大小为N的整数数组,定义为{a,a ,. 。 。 , 一个 }。它必须将arr作为参数,按升序频率对其元素进行排序,然后将排序数组的每个元素作为新的输出行打印。如果2个或更多元素具有相同的频率,则该元素子集应按非递减顺序排序。

Sample Input 0 53124 
Sample Output 0 1342 

我正在尝试用Java和Python来解决这个问题作为我的学习练习,我在Java中使用它但不确定如何在Python中处理它。

public class CustomSort {
    public static void main(String[] args) {
        int[] arr = { 5, 3, 1, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 5, 4 };
        customSort(arr);
    }

    static void customSort(int[] arr) {
        Map<Integer, Integer> map = new HashMap<>();
        List<Integer> numbers = new ArrayList<>();

        for (int i : arr) {
            if(map.containsKey(i)) {
                map.put(i, map.get(i) + 1);
            } else {
                map.put(i, 1);
            }


            if (!numbers.contains(i)) {
                numbers.add(i);
            }
        }

        Collections.sort(numbers);

        List<Integer> returning = new ArrayList<>(numbers);
        int count = 1;
        while(!returning.isEmpty()) {
            returning = print(returning, map, count);
            count++;
        }

    }

    static List<Integer> print(List<Integer> numbers, Map<Integer, Integer> map, int howManyItens) {
        List<Integer> returning = new ArrayList<>();

        for (Integer integer : numbers) {
            if(map.get(integer) == howManyItens) {
                for (int i = 1; i <= howManyItens; i++) {
                    System.out.println(integer);
                }
            } else {
                returning.add(integer);
            }
        }

        return returning;
    }
}

我应该如何在Python中执行此操作?

def customSort(arr):
    # what should I do here?

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

>>> li=[ 5, 3, 1, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 5, 4 ]
>>> sorted(li, key=lambda i: li.count(i))
[3, 1, 4, 5, 5, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2]

或者,您可以这样做:

def c_sort(li):
    cnt={i:li.count(i) for i in set(li)}
    return sorted(li, key=lambda e: cnt[e])

>>> c_sort(li)
[3, 1, 4, 5, 5, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2]

如果您想要对每个元素的值进行二次排序键,请形成一个元组:

def c_sort(li):
    cnt={i:li.count(i) for i in set(li)}
    return sorted(li, key=lambda e: (cnt[e], e))

>>> c_sort(li)
[1, 3, 4, 5, 5, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2]