Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据字符串的存在对列表进行排序?_Python_List_Sorting - Fatal编程技术网

Python 如何根据字符串的存在对列表进行排序?

Python 如何根据字符串的存在对列表进行排序?,python,list,sorting,Python,List,Sorting,我现在有一个列表,类似这样的: [['NJ', '10', '2000', '500', '20', '02-03-19', '15:20'], ['NJ', '15', '1500', '600', '20', '02-03-19', '15:30'], ['NYC', '25', '1500', '500', '10', '02-03-19', '15:30'], ['NYC', '15', '1200', '700', '1', '02-03-19', '15:35']] 我

我现在有一个列表,类似这样的:

[['NJ', '10', '2000', '500', '20', '02-03-19', '15:20'], 
 ['NJ', '15', '1500', '600', '20', '02-03-19', '15:30'], 
 ['NYC', '25', '1500', '500', '10', '02-03-19', '15:30'], 
 ['NYC', '15', '1200', '700', '1', '02-03-19', '15:35']]
我需要根据几个元素对它们进行排序,例如,就索引数而言,0是面积,1是重量,2是距离,3是高度,4是自主性,5是日期,6是时间戳。我已经在使用以下方法对所有元素进行排序:

list.sort(key=itemgetter(0, time_sorter, 4, 3))
其中time_sorter()是我之前构建的一个函数,它根据元素时间戳对列表进行排序。我的问题是,我需要根据“区域”对列表进行排序。例如,假设我需要对列表进行排序,并记住所有这些元素,就像我一样,但我也希望同时对其进行排序,以将索引位置为0的元素放在第一位,我该怎么做

额外的问题是:如果我在
itemgetter()
中有多个参数或sort“key”参数本身,我希望排序是反向的,但只针对其中一个参数,我该怎么做

我的最佳选择真的是将所有这些排序分为几个函数并在排序键中调用它们吗


提前谢谢

创建一个函数,返回每个项目的排序键。该函数将被多次调用,每次都使用单个项作为参数,如果需要,可以调用其中的其他函数

def _key(row):
    return row[0], time_sorter(row), row[4], row[3]
您返回的内容将用于对项目进行排序:

mylist.sort(key=_key)

itemgetter
只是一个简单的函数工厂,它创建一个函数来获取项。如果您需要更复杂的功能,您应该使用数字创建自己的函数,您可以通过有选择地使用减号(例如
vectors)来反转某些键的排序,但不能反转其他键的排序。sort(key=lambda v:(v.x,-v.y))
首先按
x
组件的升序对
向量列表进行排序,然后由
y
组件按降序作为连接断路器。不幸的是,没有等效的方法来处理字符串

一个好的选择是编写一个类,将数据表示为对象而不是列表,并在类上定义自定义顺序。decorator简化了这一过程,因此您只需定义
\uuuu eq\uuu
\uu lt\uuuu
,而无需定义所有六种比较方法:

从functools导入总排序
@总订单
上课地点和时间:
定义初始(自我、面积、体重、距离、身高、自主性、日期、时间):
self.area=面积
自重
self.distance=距离
自我高度=高度
自主
self.date=日期
self.time=时间
定义(自身、其他):
返回self.\uu dict.\uuu==其他.\uu dict__
定义(自身、其他):
#测试自身是否<其他
如果不存在(其他、地点和时间):
raise VALUE ERROR(“不可比较”)
elif self.area!=其他方面:
#使用>而不是按区域按相反顺序排序<
返回self.area>other.area
elif self.date!=其他日期:
返回self.date而不是按相反顺序按自治排序<
返回self.autonomy>other.autonomy
其他:
返回自身高度<其他高度
这样,只需使用
objects.sort()
即可对对象列表进行排序,而无需提供键。如果您特别希望将一个区域(如
'NYC'
)排序到列表的开头,您仍然可以使用自定义键:

objects.sort(key=lambda obj:(obj.area!='NYC',obj))
这是因为当
obj.area==“NYC”
时,比较将是
False
,否则它将是
True
,因此比较
False
意味着
“NYC”
将出现在其他区域之前


编写类可能还有其他好处,例如,它可以让您编写
obj.time
,而不是编写描述性较低的
lst[6]
,并且您可以编写其他方法来简化代码的其他部分。

事实上,这并不是我想要的,我相当确定我想要的东西可以在键本身内完成,我只是不知道怎么做,但这里的问题并不完全是使用我的函数。我能做到。问题是,我不知道如何对列表进行排序,以将元素与我首先要求的字符串放在一起。很抱歉,回到您的答复,我意识到它比我以前认为的更合适。但是我没有完全理解你想要得到什么/你是如何使用你的_键功能的,你能详细说明一下吗?我相信这正是我想要的,只是不是在它的当前状态。另外,我也不确定通过这种方法,我是否能找到一种方法,通过出现“NYC”或“NJ”或任何我想要的字符串对列表进行排序,但也许我误解了,你能具体说明一下吗?谢谢!涉及负号的技术正是我想要的。关于其余部分,我希望根据给定的字符串对列表进行排序,并使用一些关键参数对列表进行反向排序,但不能同时对两者进行排序。此外,我已经为索引值指定了名称。谢天谢地,我不想到处使用数字索引值,那将是一片混乱。谢谢你的意见!这正是我想要的关于奖金问题的答案。我编辑了一个例子,用自定义键对列表开头的
'NYC'
进行排序。这是一种逻辑方法,我肯定会研究它并在这里使用它,但我真的想用更简单的方法来处理这个字符串排序问题,还涉及lambda的使用。非常感谢。