使用Python中的itertools imap对列表进行排序

bfb*_*bfb 0 python sorting python-itertools

我想知道当我执行此代码时发生了什么,以及是否有更好的方法来完成相同的任务.是否在内存中创建列表以执行排序,然后将bar指定为foo.values()的迭代器?或者可能foo.values()在分配的字典内存空间中排序(似乎不太可能)?

想象一下,列表中的第一个值,整数,是指文件中的行号.我想打开文件并仅更新foo.values()列表中引用的行与列表中的其余数据(EG更新行1,字符串'123'和'097').

from itertools import imap

>>> foo = {'2134':[1, '123', '097'], '6543543':[3, '1'], '12315':[2, '454']}
>>> bar = imap([].sort(), foo.values())
Run Code Online (Sandbox Code Playgroud)

谢谢〜

aba*_*ert 5

首先,你正在传递[].sort(),这只是None第一个参数imap,意味着它什么都不做.正如文档所解释的那样:"如果函数设置为None,则imap()将参数作为元组返回."

要将callable传递给更高阶函数imap,你必须传递callable本身,而不是调用它并传递结果.

另外,你不想[].sort在这里; 这是一个可调用的,没有参数只能排序一个空列表,这是没用的.

你可能想要的是list.sort,未绑定的方法,它是一个可调用的参数,它将对它给出的任何列表进行排序.


所以,如果你这样做,那么你将创建一个迭代器,如果你迭代它,它将生成一堆None值,并且作为副作用,对每个列表进行排序foo.values().不会在任何地方创建新列表,因为list.sort就地改变列表并返回None.

但是既然你无论如何都不会迭代它,那么你投入的东西几乎不重要imap; 它实际上做的实际上没什么.


一般来说,滥用map/ imap/理解/等.对于表达式的副作用是一个坏主意.生成无用值的迭代器,但无论如何都要进行迭代,最多只会产生混淆.

这里简单的做法就是使用一个循环:

for value in foo.values():
    value.sort()
Run Code Online (Sandbox Code Playgroud)

或者,不是就地排序,而是生成新的排序值:

bar = imap(sorted, foo.values())
Run Code Online (Sandbox Code Playgroud)

现在,在迭代时bar,每个列表都将被排序并提供给您,因此您可以使用它.如果您遍历这个,它在内存中生成每个列表排序列表...但只有一个将永远活着,在一个时间(除非你明确地藏匿某处他们).