【问题标题】:How to go trough a list without for loops如何在没有 for 循环的情况下遍历列表
【发布时间】:2020-04-24 16:38:29
【问题描述】:

我正在尝试通过一个名为 message 的列表,这是一个简单的单词并对其进行编码。

我还有一本名为 symbol_code_table 的字典,其中包含单词中每个字母的代码。

类似这样的:

symbol_code_table = {'a': '011', 'b': '10', 'c': '010', 'd': '00', 'n': '11'}
message = "caba"

所以结果会是这样的:

010 011 10 011

下面,我展示了执行此操作的函数

def encode_huff (message , symbol_code_table):

    binary_code = ''

    for i in message:
      if (i in symbol_code_table):
        binary_code += symbol_code_table[i] 

我想知道是否有另一种方法可以在不必使用for loop 的情况下传递消息

非常感谢您!

【问题讨论】:

  • 我不明白你怎么能不使用循环来做到这一点
  • 你的代码不会产生你报告的输出,即使你是return/print()binary_code。空间不见了。
  • 在没有循环的情况下执行此操作的唯一方法是 a) 逐行编写循环中执行的每个操作,或 b) vectorize 您的代码。
  • @RoadRunner 不清楚问题是否是“如果没有for <item> in <iterable>: 语法,我该如何完成?”或“我如何在不重复列表的情况下做到这一点?”我在下面的回答解决了第一个问题,而您将其作为第二个阅读。
  • 如果你不关心空格,你可以写:message.translate(str.maketrans(symbol_code_table)).

标签: python list loops for-loop


【解决方案1】:

你当然可以用函数范式,这里使用map

binary_code = "".join(map(lambda s: symbol_table.get(s, ""), message))

【讨论】:

  • 请使用"' 修复您的代码,而不是。否则这可能是公认的答案应该是,
  • 您可能应该注意到,这仍然会在message 上循环。它只是隐藏在map() 函数中。
  • @norok2 确实,我也注意到了,但在 iPhone 上找不到简单的方法:/
  • @code-apprentice:我认为很明显需要某种迭代。不过,这个问题专门询问“for 循环”,而不是“任何类型的任何循环”:)
  • @smassey 你和我都认为这里的迭代很明显,但未来的访问者可能不会。这个区别的问题是模棱两可的。标题说“没有循环”,而正文说“不必使用 for 循环”。我认为澄清map() 不是明确的for 循环很重要,它仍然是一个循环。
【解决方案2】:

我的解决方案:

binary_code = ' '.join(list(map(lambda s: symbol_code_table.get(s),message)))

【讨论】:

    【解决方案3】:

    我想知道是否有另一种无需使用 for 循环即可处理消息的方法。

    您可以改用列表推导:

    binary_code = ''.join([symbol_code_table[i] for i in message])
    

    请注意,这仍然是一个循环。换句话说,运行效率并没有提高。语法更加简洁。

    【讨论】:

    • 我认为这个答案不能回答实际问题
    • @AdamBajger 为什么不呢?
    • 因为问题是,是否有办法避免 for 循环。您建议使用 for 循环作为解决方案。
    • @AdamBajger 对不起......我的答案中的 for 循环在哪里?有一个列表推导式,它是一个循环结构,但它不是一个 for 循环。此外,我回答末尾的警告澄清了这种区别。
    【解决方案4】:

    通常我会说不。您需要至少访问每个元素一次才能对其进行编码,这总是会导致某种形式的 for 循环,无论您编写得多么好。

    如果你只需要它来避免python代码中的“for”关键字,请使用尾递归。

    如果您正在寻找加速,您可以将消息拆分成块,在并行线程中对其进行编码,然后以正确的顺序连接结果以获得完整的编码消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-27
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多