Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中创建字符串数组的最佳方法是什么?_Python_Arrays_String - Fatal编程技术网

在python中创建字符串数组的最佳方法是什么?

在python中创建字符串数组的最佳方法是什么?,python,arrays,string,Python,Arrays,String,我对Python及其库比较陌生,我想知道如何创建具有预设大小的字符串数组。java很简单,但我想知道如何在python中实现这一点 到目前为止我所能想到的就是 strs = ['']*size 当我试图对其调用字符串方法时,调试器会告诉我一个错误X操作在对象元组中不存在 如果是java,这就是我想要做的 String[] ar = new String[size]; Arrays.fill(ar,""); 请帮忙 错误代码 strs[sum-1] = strs[sum-1].stri

我对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中实际上不需要使用固定大小的数组(列表),因此您始终能够使用append增加数组的大小,使用pop扩展或减少数组的大小,或者至少可以使用切片

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

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


当然,在某些情况下可能需要更具体的东西。在您的情况下,一个好主意可能是使用deque。请在此处查看帖子:。使用此选项,可以创建具有固定大小的三角形。如果将新值附加到末尾,则删除第一个元素(deque的头部),并将新项附加到deque上。这可能满足您的需要,但我不认为这是Python的“标准”。

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

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

你想做这样的事吗

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

错误消息说明了一切:
strs[sum-1]
是一个元组,而不是字符串。如果你展示更多的代码,有人可能会帮助你。没有这些,我们只能猜测。

有时我需要一个空字符数组。您不能执行“np.empty(size)”,因为如果您稍后填写字符,将报告错误。然后我通常会做一些相当笨拙的事情,但这仍然是一种方法:

# 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'

糟糕的是,数组有默认值(如果您忘记更改它们)。

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

示例

import numpy as np
arr = np.chararray((rows, columns))
这将创建一个数组,其中所有条目都是空字符串。然后可以使用索引或切片来初始化数组

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
表示匹配
a
b
\b
表示单词边界

如果您想从用户处获取输入,这里是代码

    strs[sum-1] = strs[sum-1].strip('\(\)')
AttributeError: 'tuple' object has no attribute 'strip'
如果在新行中给出每个字符串:

strs = [input() for i in range(size)]
如果字符串由空格分隔:

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

为什么要创建一个空字符串数组?Python通常有更好的方法来处理字符串数组。你只是不擅长编程而已。不好的java习惯是不好的。在Python中运行类似的代码会带来更高的开销(不管实现如何,只有确切的差异会发生变化),但这并不是因为在Python上勉强运行的某些代码的运行速度不如一个像样的Java程序快。展示你的代码,我很可能会找到五件可以优化的事情,同时让它更具习惯性和可读性。引用一个古老的比喻:你愿意花五个小时让一个静态语言的程序运行,并在一秒钟内完成它,还是在10分钟的脚本花费10秒钟的时候喝杯咖啡?;)不,这更像是把东西扔进一个数组,然后修剪它,阅读下一个数组,作为给初学者的建议。在一些情况下,生成一个包含N个项目的列表并根据indicated操作这些项目是有效的,而不必担心首先根据需要添加项目。但由于其中一半操作项,OP的示例(使用不可变字符串)就更不有用了。我只是想分配数组所需的所有空间,而不必在运行时增加空间。允许代码更整洁,我不必担心出现问题bounds@if_zero_equals_one:(1)它不会越界,因为你不会通过索引访问它,你会迭代它。(2) 无论如何,列表都是过度分配的(追加是按O(1)!)摊销的,
[item]*n
不会比这快多少(特别是考虑到如果您做任何有趣的事情,这两种方法都只占整个运行时的一小部分)。如果以后要替换大多数项,则情况更糟。不会生成任何元组。当然要展示更多的代码。这确实很有用,但对于多维数组来说,很快就会变得难看!这一切都是好的,这是用户的错误,我的坏。由于不熟悉Python,这个问题对数组没有帮助,答案是毫无意义的,甚至使用liststrlist的建议也是一个集合数组,它可以容纳许多字符串。在使用集合中可用的方法之前,需要初始化集合。尝试上面的代码来查看构造是如何工作的。您可能需要添加解释。
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)