我有一个字典列表,并希望每个项目按特定的属性值排序.
考虑下面的数组,
[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]
Run Code Online (Sandbox Code Playgroud)
排序时name,应该成为
[{'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}]
Run Code Online (Sandbox Code Playgroud) 我想从符合条件的列表中获取第一项.重要的是,生成的方法不会处理整个列表,这可能非常大.例如,以下功能就足够了:
def first(the_iterable, condition = lambda x: True):
for i in the_iterable:
if condition(i):
return i
Run Code Online (Sandbox Code Playgroud)
这个函数可以用这样的东西:
>>> first(range(10))
0
>>> first(range(10), lambda i: i > 3)
4
Run Code Online (Sandbox Code Playgroud)
但是,我想不出一个好的内置/单线来让我这样做.如果我不需要,我不特别想复制这个功能.是否有内置方法可以使第一个项目符合条件?
在Python 2.x中,我可以将自定义函数传递给sorted和.sort函数
>>> x=['kar','htar','har','ar']
>>>
>>> sorted(x)
['ar', 'har', 'htar', 'kar']
>>>
>>> sorted(x,cmp=customsort)
['kar', 'htar', 'har', 'ar']
Run Code Online (Sandbox Code Playgroud)
因为,在我的语言中,配偶带有这个命令
"k","kh",....,"ht",..."h",...,"a"
Run Code Online (Sandbox Code Playgroud)
但在Python 3.x中,看起来我无法传递cmp关键字
>>> sorted(x,cmp=customsort)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'cmp' is an invalid keyword argument for this function
Run Code Online (Sandbox Code Playgroud)
有没有其他选择,还是我应该编写自己的排序函数?
注意:我通过使用"k","kh"等进行了简化.实际字符是Unicodes甚至更复杂,有时元组前后有元音,我已经完成了自定义比较功能,所以那部分还可以.唯一的问题是我无法将自定义比较函数传递给sorted或.sort
我无法让命令cmp()工作.
这是代码:
a = [1,2,3]
b = [1,2,3]
c = cmp(a,b)
print (c)
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Traceback (most recent call last):
File "G:\Dropbox\Code\a = [1,2,3]", line 3, in <module>
c = cmp(a,b)
NameError: name 'cmp' is not defined
[Finished in 0.1s]
Run Code Online (Sandbox Code Playgroud) 我有一个200,000项的字典(键是字符串,值是整数).
什么是打印项目的最佳/最pythonic方式,按降序值排序,然后按升序键(即2键排序)?
a={ 'keyC':1, 'keyB':2, 'keyA':1 }
b = a.items()
b.sort( key=lambda a:a[0])
b.sort( key=lambda a:a[1], reverse=True )
print b
>>>[('keyB', 2), ('keyA', 1), ('keyC', 1)]
Run Code Online (Sandbox Code Playgroud) 我想知道用两个键对元组列表进行排序的Pythonic方法是什么,其中用一个(并且只有一个)键进行排序将是相反的顺序,而用另一个键进行排序将不区分大小写.更具体地说,我有一个包含元组的列表:
myList = [(ele1A, ele2A),(ele1B, ele2B),(ele1C, ele2C)]
Run Code Online (Sandbox Code Playgroud)
我可以使用以下代码用两个键对其进行排序:
sortedList = sorted(myList, key = lambda y: (y[0].lower(), y[1]))
Run Code Online (Sandbox Code Playgroud)
要按相反顺序排序,我可以使用
sortedList = sorted(myList, key = lambda y: (y[0].lower(), y[1]), reverse = True)
Run Code Online (Sandbox Code Playgroud)
但这会按两个键的相反顺序排序.
任何提示都非常感谢.
我假设使用Python在多个文本/数字字段上排序CSV文件将是一个已经解决的问题.但我无法在任何地方找到任何示例代码,除了专注于排序日期字段的特定代码.
如何按顺序对多个字段中的相对较大的CSV文件(数万行)进行排序?
Python代码示例将不胜感激.
我对Python有些新意见......
我通过读取包含JSON消息的文件获得了一系列的dicts,即使用以下内容:
import json
ws = []
with open('messages.txt', 'r') as f:
for line in f:
data = json.loads(line)
ws.append(data)
Run Code Online (Sandbox Code Playgroud)
除了别的以外,每个JSON消息还有三个字段:"日期"和"类型"和"位置".我需要先按日期对数组进行排序,然后按相同日期的每个块中的类型进行排序,然后按相同类型的每个块中的位置进行排序.我怎样才能做到这一点?太多了!
假设我有这个元组列表:
[(30, 'B'), (50, 'B'), (40, 'C'), (10, 'A'), (80, 'A'), (5, 'A')]
Run Code Online (Sandbox Code Playgroud)
我需要按元组的第二个元素按降序对元组进行排序,但条件是具有相同第二个元素的所有元组都彼此相邻。
所以,它应该看起来像
[(80, 'A'), (10, 'A'), (5, 'A'), (50, 'B'), (30, 'B'), (40, 'C')]
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
original = ["aga", "aaa", "aba"]
dict = {
"aba": 1,
"aaa": 0,
"aga": 1
}
Run Code Online (Sandbox Code Playgroud)
我需要按dict值排序,并且断路器需要保持原始顺序,我该怎么做?示例非常简化.
我试过了:
final = sorted(sorted(original, key=lambda x: (dict[x]), key=original.index))
Run Code Online (Sandbox Code Playgroud) 我有一个包含类似于以下示例的字典的列表。我想尝试使用 tbl_nm 和 seq 对列表进行排序。不知道如何实现它。带有字典的示例列表
[
{"tbl_nm": "Table 1", "seq": 2, "data": "datapoint"},
{"tbl_nm": "Table 1", "seq": 1, "data": "datapoint"},
{"tbl_nm": "Table 1", "seq": 3, "data": "datapoint"},
{"tbl_nm": "Table 2", "seq": 2, "data": "datapoint"},
{"tbl_nm": "Table 2", "seq": 1, "data": "datapoint"},
{"tbl_nm": "Table 3", "seq": 1, "data": "datapoint"},
{"tbl_nm": "Table 4", "seq": 1, "data": "datapoint"},
{"tbl_nm": "Table 4", "seq": 2, "data": "datapoint"}
]
Run Code Online (Sandbox Code Playgroud)
预期输出:-
[
{"tbl_nm": "Table 1", "seq": 1, "data": "datapoint"},
{"tbl_nm": "Table 1", "seq": 2, "data": "datapoint"},
{"tbl_nm": …Run Code Online (Sandbox Code Playgroud)