将列表(在另一个列表中)转换为字符串,然后反转该字符串

时间:2014-04-03 08:00:32

标签: python list python-2.7

我不熟悉Python编程(以及一般编程),我们被要求开发一个函数来通过重新排列文本来加密字符串。我们得到了这个测试:

encrypt('THE PRICE OF FREEDOM IS ETERNAL VIGILENCE', 5)
'SI MODEERF FO ECIRP EHT ECNELIGIV LANRETE'

我们必须确保它适用于任何长度的任何字符串。在陷入困境之前,我已经达到了这个目标:

##Define encrypt
def encrypt(text, encrypt_value):

##Split string into list

text_list = text.split()

##group text_list according to encrypt_value    

split_list = [text_list[index:index+encrypt_value] for index in xrange\
          (0, len(text_list), encrypt_value)]

如果我现在打印结果,这会给我:

encrypt("I got a jar of dirt and you don't HA", 3)
[['I', 'got', 'a'], ['jar', 'of', 'dirt'], ['and', 'you', "don't"], ['HA']]

所以我需要将列表中的每个列表组合成一个字符串(我认为是'.join(text)?),用[:: - 1]反转它,然后将整个事物连接到一起一弦。但我这样做是怎么做到的?

4 个答案:

答案 0 :(得分:0)

要合并元素,您可以尝试使用reduce:

l = [['I', 'got', 'a'], ['jar', 'of', 'dirt'], ['and', 'you', "don't"], ['HA']]
str = reduce(lambda prev,cur: prev+' '+reduce(lambda subprev,word: subprev+' '+word,cur, ''), l, '')

这将导致:

"  I got a  jar of dirt  and you don't  HA"

如果你想删除额外的空格:

str.replace('  ',' ').strip()

在合并元素之前,可以轻松修改此减少使用以反转每个子列表:

str = reduce(lambda prev,cur: prev+' '+reduce(lambda subprev,word: subprev+' '+word,cur[::-1], ''), l, '')

或者在加入所有组合之前反转组合的子串:

str = reduce(lambda prev,cur: prev+' '+reduce(lambda subprev,word: subprev+' '+word,cur, '')[::-1], l, '')

答案 1 :(得分:0)

您可以通过一些嵌套列表推导相当简单地完成您正在寻找的内容。


例如,您已经拥有

split_list = [['I', 'got', 'a'], ['jar', 'of', 'dirt'], ['and', 'you', "don't"], ['HA']]

你现在想要的是用列表理解来反转每个单词的三元组,例如:像这样:

reversed_sublists = [sublist[::-1] for sublist in split_list]
// [['a', 'got', 'I'], ['dirt', 'of', 'jar'], ["don't", 'you', 'and'], ['HA']]

然后反转每个子列表中的每个字符串

reversed_strings = [[substr[::-1] for substr in sublist] for sublist in split_list]
// [['a', 'tog', 'I'], ['trid', 'fo', 'raj'], ["t'nod", 'uoy', 'dna'], ['AH']]

然后像你所说的那样加入他们所有人的行列。 ' .join(),例如

' '.join([' '.join(sublist) for sublist in reversed_strings])
// "a tog I trid fo raj t'nod uoy dna AH"

没有人说你不能同时做一些嵌套来做所有这些事情:

' '.join([' '.join([substring[::-1] for substring in sublist[::-1]]) for sublist in split_list])
// "a tog I trid fo raj t'nod uoy dna AH"

我个人更喜欢这种美学(以及你不需要回到剥离空间的事实),但我不确定它是否比Pablo的解决方案表现更好。< / p>

答案 2 :(得分:0)

b = [['I', 'got', 'a'], ['jar', 'of', 'dirt'], ['and', 'you', "don't"], ['HA']]

print "".join([j[::-1]+' ' for i in b for j in reversed(i)])

a tog I trid fo raj t'nod uoy dna AH 

这是你想要的......

答案 3 :(得分:0)

你是否有理由在一个列表理解中尝试这样做? 通过将其分解为部分来概念化(和实现)可能更容易:

def encrypt(text, encrypt_value):
    reversed_words = [w[::-1] for w in text.split()]
    rearranged_words = reversed_words[encrypt_value:] + reversed_words[:encrypt_value]
    return ' '.join(rearranged_words[::-1])

示例输出:

In [6]: encrypt('THE PRICE OF FREEDOM IS ETERNAL VIGILENCE', 5)
Out[6]: 'SI MODEERF FO ECIRP EHT ECNELIGIV LANRETE'