Здравствуйте, помогите, пожалуйста, с такой задачей: есть строка
data = "sadsadsadsfffffffddd dddsfd dsd"
Как её разбить на отдельные символы? Понимаю, что data.split(), но только не понятно, что в split() писать. Заранее спасибо.
Здравствуйте, помогите, пожалуйста, с такой задачей: есть строка
data = "sadsadsadsfffffffddd dddsfd dsd"
Как её разбить на отдельные символы? Понимаю, что data.split(), но только не понятно, что в split() писать. Заранее спасибо.
data уже является последовательностью (data[i] работает). Ничего вызывать не надо.
К примеру, чтобы напечатать каждый символ на отдельной строке:
for char in text:
print(char)
Что можно кратко записать: print('\n'.join(text)). Если нужен именно Питон список, то просто chars = list(text).
Если вы работаете с текстом, то используйте Unicode. Юникодные строки в Питоне являются неизменямыми последовательностями символов (Unicode code points).
Видимые пользователем буквы (grapheme clusters) могут состоять из нескольких символов, к примеру, ё буква может быть представлена как последовательность двух символов: U+435 U+308 в Unicode—u'\u0435\u0308' в Питоне:
>>> print(u'\u0435\u0308')
ё
Каждый символ может быть представлен в различных кодировках одним или несколькими байтами, к примеру, букву я (U+044F) можно закодировать в два байта: 11010001 10001111 в utf-8 кодировке:
>>> print(u'\u044f')
я
>>> u'\u044f'.encode('utf-8')
b'\xd1\x8f' # два байта: 209, 143
Байты/байтовая строка (bytes тип) это неизменяемая последовательность байт в Питоне.
str тип является bytes в Питоне 2. str является Unicode в Питоне 3.
Кроме того существует понятие code unit (8 бит в utf-8, 16 бит в utf-16). Строки в Javascript можно часто рассматривать как последовательности utf-16 code unit (может иметь значение при переносе функциональности в Питон), к примеру, смайлик (U+1F602) символ представлен как два code unit: D83D DE02 в utf-16(BE) кодировке:
>>> print(u'\U0001F602')
>>> u'\U0001F602'.encode('utf-16be')
b'\xd8=\xde\x02' # четыре байта: 216, 61, 222, 2
То есть, если у вас текст, представленный как str в Питоне 3 (Юникод), то вы можете его рассматривать как различные последовательности в зависимости от задачи:
>>> import regex # $ pip install regex
>>> text = 'я ё' # 6 code points
>>> print(ascii(text))
'\u044f \U0001f602 \u0435\u0308'
>>> regex.findall(r'\X', text) # 5 grapheme clusters
['я', ' ', '', ' ', 'ё'] # 5 user-perceived characters
>>> utf16codeunits(text) # 7 utf-16 code units
(1103, 32, 55357, 56834, 32, 1077, 776)
>>> text.encode('utf-16be') # 14 bytes in utf-16
b'\x04O\x00 \xd8=\xde\x02\x00 \x045\x03\x08'
>>> text.encode('utf-8') # 12 bytes in utf-8
b'\xd1\x8f \xf0\x9f\x98\x82 \xd0\xb5\xcc\x88'
где utf16codeunits().
Для начала вопрос - а для чего разбивать-то? Если нужно обращаться к каждому символу отдельно, то это можно делать так:
data[i]
а по теме: .split работает так:
arr = data.split('<символ(ы) для разделения>')
получается массив arr. Если вы поставите символ для разделения " " (пробел), то в массиве у вас будет три элемента.
data.split('')
Даёт исключение
ValueError: empty separator
– timka_s
Nov 12 '11 at 15:20
data = [[a,4], [s,6], [e, 9]]
Как-то так, если знаете, какой-либо другой подход или как-то по другому реализовать задачу, то напишите, пожалуйста, буду благодарен:)
– Rumato Nov 12 '11 at 15:27Если нужен список, то так:
data = "sadsadsadsfffffffddd dddsfd dsd"
l = list(data)
print(l)
['s', 'a', 'd', 's', 'a', 'd', 's', 'a', 'd', 's', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'd', 'd', 'd', ' ', 'd', 'd', 'd', 's', 'f', 'd', ' ', 'd', 's', 'd']
Вот ваш реальный вопрос: Как сделать частотный анализ встречаемости символов
На псевдо-коде ( он-же JS ) так:
str = "содержание_вашего_файла"
res = [];
for ( var i = 0; i < str.length; i++ ){
var ch = str[ i ];
if ( !res[ ch ] ) res[ ch ] = 1;
else res[ ch ]++;
}
Код анализа.
text = 'hello world'
unique_letters = set(text)
analize = {}
for letter in unique_letters:
analize[letter] = text.count(letter)
print analize # => {' ': 1, 'e': 1, 'd': 1, 'h': 1, 'l': 3, 'o': 2, 'r': 1, 'w': 1}
import collections, io
stats = collections.defaultdict(lambda: 0)
with open('some.txt', 'r') as fp:
for line in fp:
for char in line:
stats[char] += 1
Или так, что бы не плодить вложенные циклы:
import collections, io
from itertools import chain
stats = collections.defaultdict(lambda: 0)
with open('some.txt', 'r') as fp:
for char in chain.from_iterable(fp):
stats[char] += 1
Будет прекрасно работать на массиве любого размера через выражение-генератор. Массив в память при этом не загружается:
text = 'hello world' indecies = set(text) values = (text.count(letter) for letter in indecies) analize = dict(zip(indecies, values))
file_in = open('in.txt', 'r').read() exampleData = ",".join("[%s,'%s']" % (file_in.count(i) , i) for i in sorted(set(file_in)))
получается конечно же строка, а в python-не можно просто привести эту строку к типу list? Если сделать так, то не совсем то получается: list( exampleData).
– Rumato Nov 13 '11 at 05:18Конечно, лучший вариант
data = "sadsadsadsfffffffddd dddsfd dsd"
list(data)
Но еще хороший вариант:
[c for c in data]
В кавычках знак который разделяет символы:
s=input()
l=list(''.join(s))
print(l)
rgbycm
['r', 'g', 'b', 'y', 'c', 'm']
Чтобы просто вывести символы через пробел без квадратных скобок и кавычек:
s=input()
l=' '.join(s)
print(l)
rgbycm
r g b y c m
''.join(s) равно исходной строке (s). Зачем такие извращения?
– insolor
Oct 08 '17 at 13:28
В кавычках знак который разделяет символы - не верно. join предназначен для объединения последовательности (например, списка или любой другой итерируемой последовательности) строк, собирая их в одну строку с указанным разделителем. Таким образом, вы сначала разделяете строку на отдельные символы, а потом собираете обратно в целую строку (то что было, то и получили: s == ''.join(s)), а потом снова разбиваете на список из отдельных символов. В первом куске кода второй строкой можно просто записать l=list(s).
– insolor
Oct 08 '17 at 14:48
list()не нужно вызывать,dataуже последовательность в Питоне.strэто встроенное имя—лучше не использовать его как имя своей переменной. – jfs Nov 28 '16 at 22:04