#python #python-3.x #list #numpy
Вопрос:
Мне нужна была помощь в написании кода, который разбивал список строк на определенное значение, а затем запускал частоту каждой из них в виде сетки. Например:
a = ['ABGD','HDIW','ABHD']
b = ['AB','GD','HD','IW','AB','HD'] #breaking by two
#look something like this (please ignore periods):
AB HD. GD. HD. IW.
2. 2. 1. 1. 1.
Я бы предпочел, чтобы это было сделано в Numpy. Вот что у меня есть до сих пор, но первая часть (где список разбивается) разбивает строки только по отдельности, а не по заданному значению:
brk_str = [list(i) for i in a]
brk_arr = np.array(brk_str)
unique_elements, counts_elements = np.unique(brk_arr, return_counts=True)
print(np.asarray((unique_elements, counts_elements)))
Спасибо!
Комментарии:
1. Можете ли вы добавить более подробную информацию о том, как вы создаете список b. Являются ли ваши строки фиксированной длины (т. е. 4)? Если нет, то как происходит раскол? Как выглядит список b, если все ваши строки нечетной или смешанной длины?
2. Почему вы предпочитаете
numpy
? Быстро скомпилированные методы numpy в основном работают с числовыми значениями, а не со строками.unique
работает путем сортировки массива и проверки наличия соседних дубликатов. В целом это больше похоже на задачу списка, чем на задачу массива.
Ответ №1:
Еще один способ разбить строки на 2
In [753]: b = []
...: for word in a:
...: b.extend([word[:2],word[2:]])
In [754]: b
Out[754]: ['AB', 'GD', 'HD', 'IW', 'AB', 'HD']
Разделение строки на части-это строковая операция. numpy
сам по себе не реализует никаких специальных строковых методов. Даже np.char
функции используют строковые методы.
Ответ №2:
Вы можете использовать двойное значение для понимания внутри списка
brk_str = [x for i in a for x in (i[:2], i[2:])]
brk_arr = np.array([x for i in a for x in (i[:2], i[2:])])
unique_elements, counts_elements = np.unique(brk_arr, return_counts=True)
print(np.asarray((unique_elements, counts_elements)))
[['AB' 'GD' 'HD' 'IW']
['2' '1' '2' '1']]
Классический способ манипулировать данными с заданным количеством collections.Counter
c = Counter([x for i in a for x in (i[:2], i[2:])])
print(c) # {'AB': 2, 'HD': 2, 'GD': 1, 'IW': 1}