根据某些条件对数组中的子数组进行排序 - Python

时间:2015-02-04 00:43:36

标签: python arrays sorting

如果X = [['orange','apple','red'],['$40','red','apple','30','orange'],['cool','apple'], ['pool','fun','e']...],是否可以根据我们指定的某些条件重新排列子阵列?

如我们所见,对于这个数组,每个子数组的大小都不同。所以,如果我们说我们想看到" apple"首先出现在每个子阵列中,然后" apple"应该首先出现在每个子数组中。或者如果那是不可能的话,那么" orange"应该先到,如果那是不可能的,那么......

所以我的意思是,X在重新排列数组后应显示为X = [['apple','orange','red'],['apple','$40','red','30','orange'],['apple','cool'], ['pool','fun','e']...]。怎么能这样做?我试过了X.sort但是对它进行了不同的排序。我尝试搜索谷歌,并没有任何有用的东西。

如果有人能指出我正确的方向或教程方向,那就太棒了!

提前致谢。

4 个答案:

答案 0 :(得分:1)

循环遍历X的每个项目(例如item),然后遍历包含['apple', 'oranges', ...]等的列表,因此对于此列表中的每个项目(例如x),请调用{{ 1}}在list.remove上,如果它没有任何错误,那么只需将其插回到第0个索引并突破内循环,否则继续使用' orange'和其他内部循环中的项目。

item

<强>输出:

X = [['orange','apple','red'],
     ['$40','red','apple','30','orange'],
     ['cool','apple'], ['pool','fun','e']]

items = ['apple', 'orange']

for item in X:
    for x in items:
        try:
            item.remove(x)
            item.insert(0, x)
        except ValueError:
            pass
        else:
            break

print X

答案 1 :(得分:0)

def make_preference_getter(items):
    prefs  = {item:i for i,item in enumerate(items)}
    bad_val = len(prefs)
    return lambda x: prefs.get(x, bad_val), bad_val

def my_sort(lst, pref_fn, bad_val):
    pref, item = min((pref_fn(item), item) for item in lst)
    if pref == bad_val:
        # no preferred value found
        return lst
    else:
        index = lst.index(item)
        return [item] + lst[:index] + lst[index + 1:]

然后

pref_fn, bad_val = make_preference_getter(["apple", "orange", "red"])

data = [
    ['orange','apple','red'],
    ['$40','red','apple','30','orange'],
    ['cool','apple'],
    ['pool','fun','orange']
]

data = [my_sort(sublst, pref_fn, bad_val) for sublst in data]

产生

[['apple', 'orange', 'red'],
 ['apple', '$40', 'red', '30', 'orange'],
 ['apple', 'cool'],
 ['orange', 'pool', 'fun']]

答案 2 :(得分:0)

您可以使用key参数sorted()来更改排序行为。空字符串在其他任何内容之前排序,因此当sort函数进行比较时,我们将'apple'转换为空字符串。

X2 = [sorted(sa, key=lambda w:'' if w == 'apple' else w) for sa in X]

答案 3 :(得分:-1)

您可以指定自己的函数来比较要排序的元素。见https://wiki.python.org/moin/HowTo/Sorting