我正在尝试对嵌套列表中的列进行排序:
lst = [["1", "2", "3", "4"],
["some text 1", "some text 2", "some text 3", "some text 4"],
["some text", "some text to analyze with RZstring", "some RZ-text to analyze", "some text to analyze with no rz-string and no textRZ"]]
根据3-rd嵌套列表字符串中区分大小写的'RZ'前缀(RZ应该位于底部):
lst = [["1", "4", "2", "3"],
["some text 1", "some text 4", "some text 2", "some text 3"],
["some text", "some text to analyze with no rz-string and no textRZ", "some text to analyze with RZstring", "some RZ-text to analyze"]]
我认为itemgetter
或lambda
- 函数应该有一些简单明了的方法,但是看不到明显的解决方案。
答案 0 :(得分:2)
你似乎在这里混淆了两个问题。首先是排序这样的嵌套列表,第二个是如何根据那些RZ
事物进行排序。
您可以通过首先转置多维数组来执行前者,以便属于一起的项实际上位于同一子列表中。然后,您可以根据第3个列表项上的排序函数进行排序。
>>> list(zip(*sorted(zip(*lst), key=lambda x: x[2])))
[('3', '1', '2', '4'), ('some text 3', 'some text 1', 'some text 2', 'some text 4'), ('some RZ-text to analyze', 'some text', 'some text to analyze with RZstring', 'some text to analyze with no rz-string and no textRZ')]
然而,对于你的第二个问题,我并不真正理解这种排序是基于什么的。如果它是RZ
之前的前缀,那么后两个项目是否仍然会被反转?
根据您在评论中更新的规范,您可以使用正则表达式检查RZ
是否出现前面的单词边界(\b
),并从排序中添加该事实 - 键:
>>> import re
>>> list(zip(*sorted(zip(*lst), key=lambda x: (re.search(r'\bRZ', x[2]) != None, x[2]))))
[('1', '4', '3', '2'), ('some text 1', 'some text 4', 'some text 3', 'some text 2'), ('some text', 'some text to analyze with no rz-string and no textRZ', 'some RZ-text to analyze', 'some text to analyze with RZstring')]
答案 1 :(得分:0)
我首先将您的三个列表转换为单个三元组列表:
newList = zip(*lst)
这会给你:
[("1", "some text", "some text"), ...]
您需要定义一个排序函数来编码RZ
规则,但是很容易排序:
def sortFunc(item):
# example, not sure what you need
return item[2].lower().count("rz")
sorted(newList, key=sortFunc)