【发布时间】:2013-10-03 14:45:28
【问题描述】:
我们知道这两种方法都适用于 sorted():
sorted(['second', 'first', 'third'])
sorted([('first','second'), ('second', 'first'), ('first', 'third')])
通过对第二个进行排序,元组按字典顺序进行比较;比较第一个项目;如果它们相同,则比较第二个项目,依此类推。
但是如何在所有单独的字符串(或其他任何字符串)上应用一个 key 函数来进行排序,它适用于容器并在第二种情况下递归地工作?假设 func 将“first”转换为 3,将“second”转换为 1,将“third”转换为 2。我想要这个结果:
['second', 'third', 'first']
[('second', 'first'), ('first','second'), ('first', 'third')]
我将此函数用作键,但我不喜欢在其中进行类型检查,因为它仅将 func 应用于不是通用解决方案的字符串:
def recursively_apply_func_on_strings(target, func,
fargs=(), fkwargs={}):
if isinstance(target, str):
return func(target, *fargs, **fkwargs)
result, f = [], recursively_apply_func_on_strings
for elem in target:
result.append(f(elem, func, fargs, fkwargs))
return tuple(result)
sorted(sequence, key=lambda x: recursively_apply_string_func(x, func))
有没有更简洁的方法来做到这一点?
【问题讨论】:
-
我认为没有比您拥有的更好的算法了。您可以使用
tuple构造函数中的生成器表达式使代码更好一些,而不是将值逐个附加到结果中,但这是我唯一能看到改进的地方。如果您不喜欢检查str,请考虑在任何字符串或任何不可迭代的字符串上调用func(您希望从递归案例中排除字符串,因为它们可以永远递归迭代)。使用isinstance(target, collections.Iterable)测试可迭代类型。 -
感谢您指出这一点,有时我想念使用它们,生成器表达式。 :)
标签: function sorting python-3.x tuples