Каков наилучший способ создания массива строк в Python? - PullRequest
37 голосов
/ 16 июня 2011

Я относительно новичок в 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'

Вопрос : Как мне сделать то, что я обычно делаю в Java в Python, при этом сохраняя код чистым.

Ответы [ 9 ]

61 голосов
/ 16 июня 2011

В python вы обычно не делаете то, что пытаетесь сделать.Но приведенный ниже код сделает это:

strs = ["" for x in range(size)]
21 голосов
/ 16 июня 2011

В 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']
>>> 

Конечно, в некоторых ситуациях может потребоваться что-то более конкретное. В вашем случае хорошей идеей может быть использование deque. Проверьте пост здесь: Python, заставляя список фиксированного размера . При этом вы можете создать деку, которая имеет фиксированный размер. Если новое значение добавляется в конец, первый элемент (заголовок deque) удаляется, а новый элемент добавляется в deque. Это может работать для того, что вам нужно, но я не верю, что это считается "нормой" для Python.

8 голосов
/ 16 июня 2011

Простой ответ: «Вы этого не делаете».В тот момент, когда вам нужно что-то фиксированной длины, вы либо застряли на старых привычках, либо пишете для очень специфической проблемы со своим уникальным набором ограничений.

1 голос
/ 16 июня 2011

Вы пытаетесь сделать что-то подобное?

>>> strs = [s.strip('\(\)') for s in ['some\\', '(list)', 'of', 'strings']]
>>> strs 
['some', 'list', 'of', 'strings']
1 голос
/ 16 июня 2011

Но что является причиной использования фиксированного размера? В Python фактически нет необходимости использовать массивы (списки) фиксированного размера, поэтому у вас всегда есть возможность увеличить его размер, добавляя, расширяя или уменьшая, используя pop, или, по крайней мере, вы можете использовать нарезку.

x = [''  for x in xrange(10)]
0 голосов
/ 02 ноября 2017
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 представляет границу слова

0 голосов
/ 28 июля 2017

Лучший и наиболее удобный способ создания массива строк в Python - с помощью библиотеки NumPy.

Пример :

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

Это создаст массив, содержащий все записи в виде пустых строк. Затем вы можете инициализировать массив, используя индексирование или нарезку.

0 голосов
/ 22 июля 2017

Иногда мне нужен пустой массив символов. Вы не можете сделать «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'

Плохая часть этого в том, что у вашего массива есть значения по умолчанию (если вы забыли их изменить).

0 голосов
/ 17 июня 2011

В сообщении об ошибке сказано все: strs[sum-1] это кортеж, а не строка.Если вы покажете больше своего кода, кто-то, вероятно, сможет вам помочь.Без этого мы можем только догадываться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...