我有一个字符串列表和列表。我想使用 map 反转列表中的每个可迭代对象.我当前的设置如下:
forwards_list = [
'abc',
'def',
[1, 2, 3, 4, 5],
]
def reverse(item):
object_type = type(item)
return object_type(reversed(item))
backwards_list = list(map(reverse, forwards_list))
print(backwards_list)
输出:
['<reversed object at 0x000000000A29A5C0>',
'<reversed object at 0x000000000A29A5C0>',
[5, 4, 3, 2, 1]]
期望的输出:
['cba', 'fed', [5, 4, 3, 2, 1]]
问题似乎是list(reversed([]))返回 [] ,而 str(reversed(''))返回 '<reversed object at 0x000000000A335898>' .有人可以帮忙吗?
请您参考如下方法:
如果您满足于只处理序列,您可以使用切片而不是reversed:
def reverse(item):
return item[::-1]
一般情况下,序列在切片的时候会返回一个同一时间的对象:
>>> 'foo'[::-1]
'oof'
>>> ['foo', 'bar', 'baz'][::-1]
['baz', 'bar', 'foo']
>>> ('foo', 'bar', 'baz')[::-1]
('baz', 'bar', 'foo')
但是有几种类型肯定不会起作用(例如dict)。但是,reversed 也需要序列(或具有 __reversed__ 方法的对象)。
>>> reversed(dict.fromkeys([1,2,3], None))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: argument to reversed() must be a sequence
您可以通过类型检查并结合您的原始解决方案来处理最后一种情况:
import collections # Need `collections.abc` on python3.4+ IIRC
def reverse(item):
if isinstance(item, collections.Sequence):
return item[::-1]
obj_type = type(item)
return obj_type(reversed(item))
当然,即使这样也不会在所有(大多数?)时间都有效,因为没有规则(甚至约定)说对象的构造函数必须接受从该类型的另一个实例生成的反向迭代器: 0).
