【问题标题】:What is the best way to create a string array in python?在 python 中创建字符串数组的最佳方法是什么?
【发布时间】:2011-09-16 15:22:06
【问题描述】:

我对 Python 和它的库比较陌生,我想知道如何创建一个具有预设大小的字符串数组。在 java 中这很容易,但我想知道如何在 python 中做到这一点。

目前我能想到的只有

strs = ['']*size

当我尝试对其调用字符串方法时,调试器给了我一个错误 X 操作在对象元组中不存在。

如果它是在 java 中,这就是我想要做的。

String[] ar = new String[size];
Arrays.fill(ar,"");

请帮忙。

错误代码

    strs[sum-1] = strs[sum-1].strip('\(\)')
AttributeError: 'tuple' object has no attribute 'strip'

问题:我怎样才能在 Python 中做我通常可以在 Java 中做的事情,同时仍然保持代码干净。

【问题讨论】:

  • 你为什么要创建一个空字符串数组? Python 通常有更好的方法来处理字符串数组。
  • 对于您的基本问题,请阅读:dirtsimple.org/2004/12/python-is-not-java.html
  • Python 在运行方面并没有。你只是不擅长编程。
  • 没错。不良的 Java 习惯是不好的
  • 意外的对。在 Python 中运行类似的代码会产生更高的开销(不管实现如何,只有确切的差异会发生变化),但这并不是因为您在 Python 上几乎无法运行的某些代码运行速度不如像样的 Java 程序那样快。展示你的代码,我可能会发现五件事可以优化它,同时实际上使它更惯用和可读。并且引用一个古老的比喻:你宁愿花五个小时让一个静态语言的程序运行并在一秒钟内完成它,还是在 10 分钟的脚本需要 10 秒的时候喝杯咖啡? ;)

标签: python arrays string


【解决方案1】:
strlist =[{}]*10
strlist[0] = set()
strlist[0].add("Beef")
strlist[0].add("Fish")
strlist[1] = {"Apple", "Banana"}
strlist[1].add("Cherry")
print(strlist[0])
print(strlist[1])
print(strlist[2])
print("Array size:", len(strlist))
print(strlist)

【讨论】:

  • strlist 是一个集合数组,可以容纳许多字符串。在使用集合中可用的方法之前,您需要启动一个集合。试试上面的代码,看看构造是如何工作的。
  • 您可能需要添加说明。
  • 这对我有用;但我可以解释第一行的工作原理:strlist =[{}]*10。看来*10 是数组长度,如果我不包括它,那么我的数组长度是1,而不是零。但是数组声明中的花括号是否意味着任何类型或任何长度的数组列表?
【解决方案2】:

如果你想从用户这里获取输入是代码

如果每个字符串都换行:

strs = [input() for i in range(size)]

如果字符串用空格分隔:

strs = list(input().split())

【讨论】:

    【解决方案3】:
    def _remove_regex(input_text, regex_pattern):
        findregs = re.finditer(regex_pattern, input_text) 
        for i in findregs: 
            input_text = re.sub(i.group().strip(), '', input_text)
        return input_text
    
    regex_pattern = r"\buntil\b|\bcan\b|\bboat\b"
    _remove_regex("row and row and row your boat until you can row no more", regex_pattern)
    

    \w表示匹配单词字符,a|b表示匹配ab\b表示单词边界

    【讨论】:

      【解决方案4】:

      在 python 中创建字符串数组最好和最方便的方法是借助 NumPy 库。

      示例

      import numpy as np
      arr = np.chararray((rows, columns))
      

      这将创建一个数组,其中所有条目都为空字符串。然后,您可以使用索引或切片来初始化数组。

      【讨论】:

        【解决方案5】:

        有时我需要一个空字符数组。不能做"np.empty(size)",因为后面填char会报错。然后我通常会做一些很笨拙的事情,但这仍然是一种方法:

        # Suppose you want a size N char array
        charlist = [' ']*N # other preset character is fine as well, like 'x'
        chararray = np.array(charlist)
        # Then you change the content of the array
        chararray[somecondition1] = 'a'
        chararray[somecondition2] = 'b'
        

        这个不好的部分是你的数组有默认值(如果你忘记改变它们)。

        【讨论】:

          【解决方案6】:

          错误信息说明了一切:strs[sum-1] 是一个元组,而不是一个字符串。如果您显示更多代码,那么有人可能会为您提供帮助。没有它,我们只能猜测。

          【讨论】:

          • 这一切都很好,这是用户错误我的错。刚接触 Python 并没有帮助
          【解决方案7】:

          但是使用固定大小的原因是什么?在 python 中实际上不需要使用固定大小的数组(列表),因此您始终可以使用 append 来增加它的大小,使用 pop 来扩展或减小,或者至少您可以使用切片。

          x = [''  for x in xrange(10)]
          

          【讨论】:

          • 问题要求数组,答案是没有意义的,即使是使用列表的建议
          【解决方案8】:

          您是否正在尝试做这样的事情?

          >>> strs = [s.strip('\(\)') for s in ['some\\', '(list)', 'of', 'strings']]
          >>> strs 
          ['some', 'list', 'of', 'strings']
          

          【讨论】:

          • 不,这更像是把东西扔进一个数组,然后修剪它以供下一个读取
          【解决方案9】:

          在 python 中,你通常不会做你想做的事情。但是,下面的代码会做到这一点:

          strs = ["" for x in range(size)]
          

          【讨论】:

          • 不会生成任何元组。显示更多课程代码。
          • 这可以解决问题,但对于多维数组来说很快就会变得丑陋!
          【解决方案10】:

          在 Python 中,通常倾向于使用非固定大小的列表(也就是说,可以动态地将项目附加/删除到其中)。如果您遵循此操作,则无需提前分配固定大小的集合并用空值填充它。相反,当您获取或创建字符串时,您只需将它们添加到列表中。当需要删除值时,您只需从字符串中删除适当的值。我想您可能可以为此使用这种技术。例如(在 Python 2.x 语法中):

          >>> temp_list = []
          >>> print temp_list
          []
          >>> 
          >>> temp_list.append("one")
          >>> temp_list.append("two")
          >>> print temp_list
          ['one', 'two']
          >>> 
          >>> temp_list.append("three")
          >>> print temp_list
          ['one', 'two', 'three']
          >>> 
          

          当然,有些情况可能需要更具体的东西。在您的情况下,一个好主意可能是使用双端队列。在这里查看帖子:Python, forcing a list to a fixed size。有了这个,您可以创建一个具有固定大小的双端队列。如果一个新值附加到末尾,则删除第一个元素(双端队列的头部)并将新项目附加到双端队列中。这可能满足您的需要,但我不认为这被认为是 Python 的“规范”。

          【讨论】:

            【解决方案11】:

            简单的答案是,“你不知道。”当你需要一些固定长度的东西时,你要么被困在旧习惯上,要么为一个非常具体的问题而写作。

            【讨论】:

            • 对初学者的建议是正确的。在某些情况下,生成 N 个项目的列表并根据 indiced 操作这些项目是一种有效的方法,而不必担心首先根据需要添加项目。但由于其中有一半操作项目,OP 的示例(使用不可变字符串)就更没用了。
            • 我只是想为数组分配我需要的所有空间,而不必在运行时增加。让代码更整洁,我不必担心事情超出范围
            • @if_zero_equals_one: (1) 它不会越界,因为你不会通过索引访问它,你会迭代它。 (2) 列表无论如何都会过度分配(追加是摊销 O(1)!)并且[item]*n 不会比这快得多(特别是考虑到如果你做任何有趣的事情,两者都只会占用整个运行时间的一小部分完全)。如果您以后要更换大部分物品,那就更是如此。
            猜你喜欢
            • 1970-01-01
            • 2010-10-17
            • 2011-03-12
            • 2011-01-18
            • 1970-01-01
            • 1970-01-01
            • 2021-09-20
            • 2016-01-03
            • 1970-01-01
            相关资源
            最近更新 更多