基于排序子集排序完整集
Posted
技术标签:
【中文标题】基于排序子集排序完整集【英文标题】:Sort full set based off sorted subset 【发布时间】:2016-02-03 14:25:54 【问题描述】:假设我有一个以前排序的列表:ABCDEF。用户可以过滤掉其中一些项目以得到一个子集,例如:BCEF。在子集中,然后允许用户重新排序这些项目。例如,他们将 B 移动到 E 之后,现在子集是:CEBF。然后他们关闭过滤器。我希望原始列表反映重新排序的子集。所以完整列表现在应该如下所示:ACDEBF。
我在这里寻找什么分类技术?其他可能相关的信息:
-
在子集阶段,用户一次只能移动一项
过滤器可以创建一个包含任意数量项目的子集;它可能是完整列表,也可能只是两个项目(从技术上讲,它可能会下降到 0,但 0 和 1 的情况变得微不足道,因为用户无法重新排序子集)
原始列表中不在子集中的项目应尽可能保留它们的位置。
【问题讨论】:
【参考方案1】:这里有一个解决方案:
sorted_fullset = ["a","b","c","d","e","f"]
sorted_subset = ["a","b","e"]
def shuffle_set_by_subset(sorted_fullset,sorted_subset,shuffled_subset):
shuffle = dict((item,idx) for idx,item in enumerate(sorted_subset))
shuffled_fullset = sorted_fullset[:]
for idx,item in enumerate(sorted_fullset):
if item in sorted_subset:
place_in_sorted_subset = shuffle[item]
shuffled_fullset[idx] = shuffled_subset[place_in_sorted_subset]
return shuffled_fullset
print shuffle_set_by_subset(sorted_fullset,sorted_subset,["e","b","a"])
print shuffle_set_by_subset(sorted_fullset,sorted_subset,["a","e","b"])
结果:
['e', 'b', 'c', 'd', 'a', 'f']
['a', 'e', 'c', 'd', 'b', 'f']
【讨论】:
【参考方案2】:给定一个预先排序的列表,每当创建子集时,请记下子集中项目相对于原始集的位置。 (例如使用另一个数组来跟踪位置)。
然后确保在重新排列项目时,索引保持不变(如果使用单独的数组,则默认情况下是这样)。
最后将重新排列的项目复制回索引数组所指示的位置。
例如:A = a,b,c,d,e,f。 B_ITEMS = b,d,e。 B_POSITIONS = 2,4,5
假设 B 中的项目重新排列如下: B_ITEMS = d,e,b
将 B_ITEMS 中的项目复制到 B_POSITIONS 指示的位置。
A = a,d,c,e,b,f
【讨论】:
谢谢。我有效地做到了,但没有明确使用额外的数组。我有原始数组 A=a,b,c,d,e,f 和原始子集 B=b,d,e。子集求助于 C=d,e,b。然后我设置了两个指针,一个在原始数组 pA 上,一个在重新处理的子集 pC 上。然后我根据以下规则开始向下递增 A 设置项:如果 pA 指向的项目不在 C 中,则将其留在原处并提前 pA。如果 pA 项在 C 中,则插入 pC 指向的项并递增 pA 和 pC。 无法完全了解您,但很高兴您解决了问题。指针可能很棘手。还要测试重复的字母!以上是关于基于排序子集排序完整集的主要内容,如果未能解决你的问题,请参考以下文章