【问题标题】:Sorting a sub-array in an array according to some condition - Python [closed]根据某些条件对数组中的子数组进行排序-Python [关闭]
【发布时间】:2015-02-04 00:43:35
【问题描述】:

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

正如我们所见,对于这个数组,每个子数组的大小都不同。因此,如果我们说我们希望看到“apple”首先出现在每个子数组中,那么“apple”应该首先出现在每个子数组中。或者如果不可能,那么“橙色”应该先出现,如果不可能,那么......

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

如果有人可以为我指出一些示例或教程的正确方向,那就太好了!

提前致谢。

【问题讨论】:

  • 显示您的X.sort 对那些试图帮助您的人非常有帮助。
  • 为什么 'orange' 移动到第一个子数组的最后一个位置?
  • @AshwiniChaudhary 这实际上是一个错误。 “橙色”应该排在第二位。
  • @user65422 子列表中是否有可能包含多个“苹果”或“橙色”?
  • @AshwiniChaudhary 没有。只有一个。

标签: python arrays sorting


【解决方案1】:

循环遍历 X 的每个项目(例如 item),然后遍历包含 ['apple', 'oranges', ...] 等的列表,因此对于此列表中的每个项目(例如 x),在 item 上调用 list.remove 和如果它可以正常工作,则只需将其插入第 0 个索引并跳出内部循环,否则继续使用“橙色”和内部循环中的其余项目。

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

输出:

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

【讨论】:

    【解决方案2】:
    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']]
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 还没试过,但“x:''”没有报错?
      • 没有。这是 lambda 函数的语法。我想我应该使用x 以外的变量以避免与X 混淆。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2013-09-30
        • 1970-01-01
        • 1970-01-01
        • 2016-07-13
        • 2023-03-26
        • 1970-01-01
        • 2011-12-15
        • 2018-11-01
        • 2021-03-08
        相关资源
        最近更新 更多