我有以下清單:
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']
uj5u.com熱心網友回復:
假設 inl1中的每個元素都是 in中某個元素的超字串l2,您可以使用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裝置線性復雜(在大小l2在每個元件)l1。如果_很重要,即如果 中的元素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).
uj5u.com熱心網友回復:
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']
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/339443.html
上一篇:如何將多個串列從一個變數轉換為一個串列(odoov11)?
下一篇:向串列的每個元素添加字母
