我有一个算法包含以下情况;我想知道是否有可能有所改进(我认为不可能,但我可能错了)。
我有一个对象列表。我有两个不同的(独立的)键来对它们进行排序:mykey1
和mykey2
。实际上,我可以在算法开始时以两种方式对列表进行排序,而无需花费大量成本;因此,我有两份清单:
A = sorted(L, key=mykey1)
B = sorted(L, key=mykey2)
(Python语法,但我认为任何人都能理解)。在这个阶段,只要复杂性保持在O(nlogn)以下,我完全可以做更多的事情(初始化新变量)。
我需要提取A
的许多子列表;由于明显的原因,我希望在算法的主循环中使用索引(开始和结束),而不是实际复制子列表。
现在,对于A
的任意子列表(由两个索引知道),是否有一些棘手的方法可以根据B
中相应的顺序(非常相同的对象)迭代其对象?
下面是一个简单的例子:
L = [(7,2), (4,3), (5,9), (1,8)]
mykey1 = lambda e: e[0]
mykey2 = lambda e: e[1]
A = sorted(L, key=mykey1) # A = [(1,8), (4,3), (5,9), (7,2)]
B = sorted(L, key=mykey2) # B = [(7,2), (4,3), (1,8), (5,9)]
当处理由A[0:2]
构成的子列表时,是否有一些棘手的方法来迭代[(4,3), (1,8)]
(因为对象(4,3)
在对象之前(1,8)
根据键mykey2
。为此,我想避免迭代任何其他对象,而不是那些实际属于A[0:2]
的对象?
我可以通过迭代整个B
并检查对象是否在子列表中(通过向对象添加一些字段来给出其在A
中的位置,这并不难实现),来实现复杂度O(n);我能做得更好吗?
自从我使用Python以来已经有很长一段时间了,但是像这样的东西不管用吗?
C = sorted(A[0:2], key=mykey2)
然后在将这个“B”排序/键应用于A子列表后,在C上迭代以生成它,或者您可以将列表减去
C = B - A[2:2]
如果您的子列表可以增量生成,那么这可能是一种生成它们的简单方法,已经按B排序。与其从一个子列表开始并尝试按B顺序遍历它们,不如将它转过来,从B开始,通过按顺序删除项目来生成子列表。
或者我在这里遗漏了什么。这个答案似乎太简单了。
I would suggest the next code snippet:
L = [(7,2), (4,3), (5,9), (1,8)]
mykey1 = lambda e: e[0]
mykey2 = lambda e: e[1]
A = sorted(L, key=mykey1)
C = [sorted(_, key=mykey2) for _ in (A[0:_] for _ in (_ for _ in range(1, len(A) + 1)))]
C will be a list containing the sub-lists:
[[(1, 8)],
[(4, 3), (1, 8)],
[(4, 3), (1, 8), (5, 9)],
[(7, 2), (4, 3), (1, 8), (5, 9)]]
Or, if we want to make C a [generator][1] (instead of a list); for lists we are keeping all elements in memory (performance issue) :
C = (sorted(_, key=mykey2) for _ in (A[0:_] for _ in (_ for _ in range(1, len(A) + 1))))
Hope it helps.
问题内容: 我有一个奇怪的清单,以下列方式建立: 我想先按数字(desc)排序,然后如果数字相同,则按名称(asc)排序。所以我想要的结果是: 我试图考虑可以在sort方法中使用的lambda函数,但是我不确定是否可以这样做。 问题答案: python中的sort函数允许将函数作为sort键传递: 编辑: 1.排序顺序 2.演示复制和就地排序
问题内容: 我在尝试实现的算法周围束手无策。我有两个列表,希望从两个列表中进行特定组合。 这是一个例子。 在这种情况下,输出为: 我的名字可能比数字多,即。这是一个具有3个名称和2个数字的示例: 输出: 问题答案: 注意 :此答案是针对上面提出的特定问题的。如果您来自Google,只是想寻找一种使用Python获得笛卡尔积的方法,或者您可能正在寻找简单的列表理解方法- 请参见其他答案。 假设。然后
问题内容: 我有两个列表,例如: 如何创建这些列表的所有排列,如下所示: 我可以用吗? 问题答案:
在这里完成python noob,但我正在慢慢地将我的头缠绕在它周围。我正在制作一个1v1光环3锦标赛风格的程序,随机匹配玩家并选择地图、游戏类型等。。。 我遇到的问题是,我不知道如何从列表中随机调用两个不同的字符串。 假设这是球员名单,我将如何打印: 玩家1 vs玩家3 我尝试了一些不同的方法,但都没有用。我确实对随机代码库有一点了解,但我不知道如何做到这一点 随机打印。选择(玩家列表)“vs”
比如说,我有一张这样的桌子: 我想按列的升序排序,但在此范围内,我想按列的降序排序,如下所示: 我曾尝试使用orderBy(“A”,desc(“B”),但它给出了一个错误。 我应该如何在Spark 2.0中使用dataframe编写查询?