【问题标题】:Get all combination of items from one list based on another list根据另一个列表从一个列表中获取所有项目组合
【发布时间】:2021-08-09 16:22:03
【问题描述】:

根据另一个列表获取列表中所有 3 项项目组合的最有效方法是什么? 假设我有这三个列表:

 sec_floors= [1, 2, 3],
 assigned_floor= [1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3],
 sector_number= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],

我需要根据来自assigned_floor 的对应数字从扇区sector_number 列表中获取所有3 个项目组合。

在 sec_floors 中,我列出了 assignment_floor 中的所有唯一号码。

所以第一个组合是:

(0,2,5)(0,2,6)(0,2,7)...

然后(0,3,5)(0,3,6)

它基于从sector_number到assingned_floor的对应数字的索引。

编辑 当我输入从最低到最高的楼层时,@Park Answer 可以正常工作,但是例如当我从列表中的较高位置开始时它会失败:

sec_floors = [16,17,18,7,6]
assigned_floor = [16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 7, 7, 7, 7 6, 6, 6]
sector_number =[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]

如果数据未排序,似乎 bisect 不起作用,但是是否可以以任何方式保持未排序?

【问题讨论】:

标签: python list combinations


【解决方案1】:

如果assigned_floor被排序了,这样怎么样?

from bisect import bisect_left as bl
from bisect import bisect_right as br
from itertools import product

sec_floors= [1, 2, 3]
assigned_floor= [1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3]
sector_number= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

sectors = [sector_number[bl(assigned_floor, i): br(assigned_floor, i)] for i in sec_floors]

pdts = list(product(*sectors))
print(pdts)

上面的bisect_left是python内置的二分查找函数。它返回其匹配值的最左侧索引。(bisect_right 返回其匹配值的最右侧索引的下一个索引)

但要使用它,请确保sec_floors 中的值在assigned_floor 中。即使值不存在,它也会返回索引。(更多信息:https://docs.python.org/3/library/bisect.html

所以

  1. 如果assigned_floor没有排序,先排序。
  2. 使用 set 或其他方式确保所有 sec_floors 值都在 assigned_floor 中。

【讨论】:

  • 我发现这不适用于未排序的数据,所以如果我以不同的顺序(如 [3,3,3,1,1,2,2])从楼层编号开始,这将失败。知道为什么会这样吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
  • 2019-06-06
  • 2010-12-24
  • 1970-01-01
  • 2021-02-10
  • 1970-01-01
相关资源
最近更新 更多