如果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
但是对它进行了不同的排序。我尝试搜索谷歌,并没有任何有用的东西。
如果有人能指出我正确的方向或教程方向,那就太棒了!
提前致谢。
答案 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