反转嵌套列表中的字符串,而不进行切片或反转

时间:2018-07-29 22:15:36

标签: python string list

在python中,如果我的列表是

TheTextImage = [["111000"],["222999"]]

一个人如何遍历此列表以创建一个新的

NewTextImage = [["000111"],["999222"]]

可以使用[:]但不能使用[::-1],并且不能使用reverse()

4 个答案:

答案 0 :(得分:1)

您可能不使用[::-1],但可以将每个范围索引乘以-1。

t = [["111000"],["222999"]]


def rev(x):
    return "".join(x[(i+1)*-1] for i in range(len(x)))

>>> [[rev(x) for x in z] for z in t]
[['000111'], ['999222']]

如果您可以在step中使用range参数,可以提出AChampions建议:

def rev(x):
    return ''.join(x[i-1] for i in range(0, -len(x), -1))

答案 1 :(得分:1)

您知道如何将一个序列一个接一个地复制到另一个序列吗?

new_string = ''
for ch in old_string:
    new_string = new_string + ch

如果要反向复制序列,只需将新值添加到左侧而不是右侧:

new_string = ''
for ch in old_string:
    new_string = ch + new_string

那真的是您唯一需要的技巧。


现在,这并不是超级有效,因为字符串连接需要二次时间。您可以使用collections.deque(可以在固定时间内追加到其左侧),然后最后调用''.join来解决此问题。但我怀疑您的老师是否期望您这样做。用简单的方法即可。


当然,您必须遍历TextImage并将其应用于列表中每个子列表中的每个字符串。这可能就是他们期望您使用[:]的目的。但这很容易。它只是遍历列表。

答案 2 :(得分:0)

如果您不能使用reversed[::-1]之类的任何标准功能,则可以循环使用collections.dequedeque.appendleft。然后使用列表推导将逻辑应用于多个项目。

from collections import deque

L = [["111000"], ["222999"]]

def reverser(x):
    out = deque()
    for i in x:
        out.appendleft(i)
    return ''.join(out)

res = [[reverser(x[0])] for x in L]

print(res)

[['000111'], ['999222']]

请注意,您可以使用列表,但是将其附加到列表的开头效率不高。

答案 3 :(得分:0)

您可以使用reduce(lambda x,y: y+x, string)来反转字符串

>>> from functools import reduce
>>> TheTextImage = [["111000"],["222999"]]
>>> [[reduce(lambda x,y: y+x, b) for b in a] for a in TheTextImage]
[['000111'], ['999222']]