【问题标题】:How to change order of list based on common element in python?如何根据python中的常见元素更改列表的顺序?
【发布时间】:2021-12-11 20:37:59
【问题描述】:

我有以下清单:

l1 = ['foo_x', 'bar_x', 'xyz_x', 'foo_y', 'bar_y', 'xyz_y']

我创建了一个包含常见元素的列表。

l2 = ['foo', 'bar', 'xyz']

# trying to reorder which is not successful

[i for i in l1 if (l2 in l1)]

我想改变 l1 的顺序以获得以下结果:

['foo_x', 'foo_y', 'bar_x', 'bar_y', 'xyz_x', 'xyz_y']

【问题讨论】:

  • foo_x(和其他人)是什么? foo 是什么?这些变量是字符串还是它们实际上是字符串,而您忽略了在它们周围添加引号?
  • 有哪些元素?它们是子列表吗?查看list.sortsorted 的key= 参数。您可能想编写一个键函数来获取 l1 中该元素的索引,但如果我们不知道这些是什么,我们将无能为力
  • 确实是字符串。

标签: python list sorting


【解决方案1】:

假设l1 中的每个元素都是l2some 元素的超字符串,您可以使用next 来按第一个匹配元素的索引进行排序。

>>> l1 = ['foo_x', 'bar_x', 'xyz_x', 'foo_y', 'bar_y', 'xyz_y']    
>>> l2 = ['foo', 'bar', 'xyz']
>>> sorted(l1, key=lambda x: next(i for i, e in enumerate(l2) if e in x))
['foo_x', 'foo_y', 'bar_x', 'bar_y', 'xyz_x', 'xyz_y']

next 表示l1 中每个元素的线性复杂度(大小为l2)。如果_ 很重要,即如果l2 中的元素始终是_ 之前的部分,则可以创建一个字典,将每个元素映射到其索引,然后使用该子字符串直接查找该索引。

>>> l2_idx = {e: i for i, e in enumerate(l2)}
>>> sorted(l1, key=lambda x: l2_idx[x[:x.index("_")]])
['foo_x', 'foo_y', 'bar_x', 'bar_y', 'xyz_x', 'xyz_y']

如果l2 中没有匹配的元素,这种形式的两种方式都会失败,但您可以为这两种方式提供在这种情况下使用的默认元素,例如len(l2).

【讨论】:

    【解决方案2】:

    IIUC,您需要.split(),然后在l2_ 之后的最后一部分排序基本索引,如下所示:

    >>> l1 = ['foo_x', 'bar_x', 'xyz_x', 'foo_y', 'bar_y', 'xyz_y']
    
    >>> l2 = ['foo', 'bar', 'xyz']
    
    >>> sorted(l1, key=lambda x: (l2.index(x.split('_')[0]), x.split('_')[1]))
    ['foo_x', 'foo_y', 'bar_x', 'bar_y', 'xyz_x', 'xyz_y']
    

    另一个例子:

    >>> l1 = ['foo_x', 'bar_x', 'xyz_x', 'foo_y', 'bar_y', 'xyz_y' , 'foo_a', 'bar_b', 'xyz_c']
    
    >>> l2 = [ 'xyz' , 'foo', 'bar']
    
    >>> sorted(l1, key=lambda x: (l2.index(x.split('_')[0]), x.split('_')[1]))
    ['xyz_c',
     'xyz_x',
     'xyz_y',
     'foo_a',
     'foo_x',
     'foo_y',
     'bar_b',
     'bar_x',
     'bar_y']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多