【问题标题】:Turn a list, that is in another list, into a string, then reverse the string将另一个列表中的列表转换为字符串,然后将字符串反转
【发布时间】:2014-04-03 08:00:32
【问题描述】:

我是 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] 反转它,然后将整个事物连接在一起一弦。但是我到底该怎么做呢?

【问题讨论】:

  • 你已经有了所有的步骤;为什么不在解释器中试验它们呢?
  • 我已经试验了一个小时...我上个月才开始编程,我几乎不知道我在做什么!

标签: python list python-2.7


【解决方案1】:

要组合你的元素,你可以尝试使用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()

这种reduce使用可以很容易地修改为在组合它们的元素之前反转每个子列表:

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, '')

【讨论】:

  • 我知道如何组合它们。我不知道的是如何在组合它们之前分别反转每个列表。并且代码也需要适用于具有任何 encrypt_value 的任何长度的字符串。
  • @SomeLameStuff 在我发布的解决方案中添加 6 个字符,然后您将反转每个子列表,然后再将其元素与其他列表组合。我已经编辑了我的答案来做到这一点。
  • 看问题,我想你需要在加入它们之前反转每个子子列表,即字符串。
  • @bsink 我刚刚编辑了我的答案以包含这种可能性。 reduce 组合非常通用。他可以去除分隔空间,我把它们放在美观上。
【解决方案2】:

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


例如,您已经拥有

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 的解决方案表现更好。

【讨论】:

    【解决方案3】:
    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 
    

    这是你想要的吗...

    【讨论】:

      【解决方案4】:

      你有什么理由试图在一个列表理解中做到这一点? 通过将其分解为多个部分,可能更容易概念化(和实施):

      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'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-01
        • 2013-10-21
        • 2016-07-05
        • 1970-01-01
        • 2020-11-30
        相关资源
        最近更新 更多