【问题标题】:alternative for range and len functionsrange 和 len 函数的替代方案
【发布时间】:2017-04-25 02:46:07
【问题描述】:

在下面的 For 循环中

def __str__(self):
    output = " "
    for i in range(len(self)):
        output += (self.str_data[i] +" ")
    return  output

我如何不使用使用 range & len 或任何其他内置 函数来重写这个?

PS:之前init中使用str_data作为list类型的实例变量。

【问题讨论】:

  • 你不想使用任何内置函数还是只使用 range 和 len
  • 没有要使用的内置函数,包括 range() 和 len()。我需要在 str 中替换它们

标签: python string function


【解决方案1】:

如果您允许使用join(),那么您可以这样做:

def __str__(self):
    return " ".join(self.str_data)

这当然是假设len(self) 的结果与len(self.str_data) 相同。

要产生与您的循环完全相同的结果,它实际上必须是:

def __str__(self):
    if self.str_data:
        return " " + " ".join(self.str_data) + " "
    else:
        return " "

【讨论】:

  • @ Vallentin:我不允许使用 join 或任何其他内置函数。
  • @phoenix_9 那你可以用什么?
  • 任何没有内置函数的东西。如果您能够稍微调整和扭曲上面的代码,那么对我来说很好。但只是避免内置函数
【解决方案2】:

新答案:(无内置函数)

def __str__(self):
    output=""
    for i in self.str_data:
         output+=i+" "
    return output

旧答案:

星号和双星号可以在列表、元组、集合和字典中使用,* 将解包列表/元组,** 将解包字典。

my_array = [0,1,2,3,4,5]
print(*my_array) # unpacking list

另一种使用join的方法:

print(' '.join(map(str,my_array)))

输出

0 1 2 3 4 5

对于给定的问题:

由于 return 关键字只返回一个参数,我们无法解包列表,我们必须使用函数

def __str__(self):  
    return ' '.join(self.str_data)

【讨论】:

  • 你知道,你不应该把每个答案都复制到你自己的。
  • @Vallentin 抱歉,我认为该列表由字符串文字组成,因为 OP 没有使用 str()。而且忘记了我可以编辑某人的答案
【解决方案3】:

你的意思是这样的?

class A(object):

    def __init__(self, str_data):
        self.str_data = str_data

    def __str__(self):
        return " ".join(str(s) for s in self)

    def __iter__(self):
        return iter(self.str_data)

if __name__ == '__main__':
    print(A(["1", "2", "3", "4", "5"]))

【讨论】:

    【解决方案4】:
    import json
    
    def __str__(self):
        output = json.dumps(self.str_data)
        output = output[1:-1].replace(',', ' ')
        return  output
    

    供您参考。

    【讨论】:

    • 我无法为我的案例导入任何模块。
    【解决方案5】:

    前面的答案非常好(如果你省略内置函数),但这里有一个更接近你所做的版本:

    output = ""
    array = [0,1,2,3,4,5]
    for i in array:
       output += "%s " % (i)
    output = output[:-1]
    return output
    

    请注意,我更改了您设置输出的方式,因为我认为是为了获得您想要的结果。就像你问的那样,它不使用任何内置函数,它工作得很好。

    【讨论】:

    • 不允许OP使用join(),所以我假设OP也不允许使用format()。但是,我认为将其更改为 i + " " 就足够了(关于 OP 不被允许使用内置函数)。
    • 很好,让我改变它!你想直接提出我会接受的修改建议吗?
    • 感谢@JoeBeCool,但不幸的是 format 是一个内置函数。 docs.python.org/3/library/functions.html
    • 要注意的是,如果str_data 包含的内容不会被隐式转换为字符串,那么这将是一个问题。 str(i) 将是解决方案,但无论出于何种原因,OP 都不允许使用内置函数!
    • 好的,现在怎么样?没有内置插件
    【解决方案6】:

    你可以使用像

    这样的高级函数
    " ".join(map(lambda x:x+" ",self.str_data))
    

    map 应用函数为self.str_data 中的每个字符串添加一个空格," ".join 将每个字符串添加到起始字符串。

    当然,这些都是内置函数,它只是一个非常干净的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 2019-12-02
      • 1970-01-01
      • 1970-01-01
      • 2014-05-26
      • 2012-01-25
      相关资源
      最近更新 更多