2012-03-23 15 views
37

Więc chcę w zasadzie wyssać linię txt z pliku .txt, a następnie przypisać znaki do listy, a następnie utworzyć listę wszystkich oddzielnych znaków w lista.Przerwij łańcuch na listę znaków w Pythonie

Lista list.

Obecnie Próbowałem:

fO = open(filename, 'rU') 
fL = fO.readlines() 

i to wszystko im do. Nie wiem, jak wyodrębnić pojedyncze znaki i przypisać je do nowej listy.

chcę zrobić coś takiego:

fL = 'FHFF HHXH XXXX HFHX' 

^^^ tak, że jest linia mam z pliku txt.

A następnie przekształcić go w ten sposób:

['F', 'H', 'F', 'F', 'H' ...] 

^^^ i że bycie nową listę, z każdego pojedynczego znaku na jego rękę.

Odpowiedz

18

Struny są iteracyjne (podobnie jak lista).

mam interpretacji, które naprawdę chcą coś takiego:

fd = open(filename,'rU') 
chars = [] 
for line in fd: 
    for c in line: 
     chars.append(c) 

lub

fd = open(filename, 'rU') 
chars = [] 
for line in fd: 
    chars.extend(line) 

lub

chars = [] 
with open(filename, 'rU') as fd: 
    map(chars.extend, fd) 

znaków będzie zawierać wszystkie znaki w pliku.

+1

@FlexedCookie ['itertools.chain'] (http://docs.python.org/library/itertools.html#itertools.chain) jest naprawdę najprostszy do tego -' chars = list (itertools.chain.from_iterable (open (nazwa pliku, "rU)))". – agf

+0

Powyższy kod nie uwzględnia białych znaków, tj. '' "' – Sebastian

72

Można to zrobić za pomocą list:

fNewList=list(fL); 

Należy pamiętać, że wszelkie przestrzenie w linii zostaną uwzględnione na tej liście, do mojej najlepszej wiedzy.

+0

z UTF-8 znaków nie działa zgodnie z oczekiwaniami. W przypadku ciągu znaków "zyć" oczekiwałem listy 3 znaków, zamiast tego otrzymałem tę listę: ['z', 'y', '\ xc4', '\ x87']. Czy możesz wskazać, co można zrobić, aby rozwiązać ten problem. Dzięki –

+0

Mam swoją odpowiedź, zapomniałem dodać "u" przed moim ciągiem, więc nie było traktowane jak unicode. dzięki. –

+0

To jest właściwie poprawna odpowiedź. – user1767754

7
fO = open(filename, 'rU') 
lst = list(fO.read()) 
3

W python wiele rzeczy jest iterable w tym plików i ciągi. Powtórzenie na podajniku plików daje listę wszystkich wierszy w tym pliku. Powtarzanie ciągu znaków daje listę wszystkich znaków w tym ciągu.

charsFromFile = [] 
filePath = r'path\to\your\file.txt' #the r before the string lets us use backslashes 

for line in open(filePath): 
    for char in line: 
     charsFromFile.append(char) 
     #apply code on each character here 

lub jeśli chcesz jedną wkładkę

#the [0] at the end is the line you want to grab. 
#the [0] can be removed to grab all lines 
[list(a) for a in list(open('test.py'))][0] 

.

.

Edycja: jak AGF wspomina można użyć itertools.chain.from_iterable

Jego metoda jest lepsza, chyba że chcesz możliwość określenia, które linie chwycić list(itertools.chain.from_iterable(open(filename, 'rU)))

To wymaga jednak jedną znać itertools, iw rezultacie traci pewną czytelność, jeśli chcesz tylko iterować po znakach i nie obchodzi cię przechowywanie listy, użyłbym zagnieżdżonych pętli. Ta metoda jest również najbardziej czytelna.

4

Albo użyć fantazyjny listowych, które mają być „obliczeniowo bardziej wydajne”, podczas pracy z bardzo dużych plików/list

fd = open(filename,'r') 
chars = [c for line in fd for c in line if c is not " "] 
fd.close() 

Btw: Odpowiedź, która została przyjęta, nie stanowią dla odstępy ...

7

Tak, aby dodać ciąg hello do listy jako pojedynczych znaków, spróbuj tego:

newlist = [] 
newlist[:0] = 'hello' 
print (newlist) 

    ['h','e','l','l','o'] 

jednak łatwiej jest czynności:

splitlist = list(newlist) 
print (splitlist) 
+0

ładny, dzięki :-) – tim

+1

Ale jeszcze łatwiejsze jest: 'newlist = list ('hello')' – tim

+1

@tim Tak, właśnie zauważyłem, że nie miałem wrzuć to :) – Tim

2
a='hello world' 
map(lambda x:x, a) 

[ 'H', 'e', ​​'L', 'L', 'O' '' 'W' 'O', 'r' , 'l', 'd']

Łatwym sposobem jest użycie funkcji "map()".

20

jestem trochę późno, to wydaje się być, ale ...

a='hello' 
print list(a) 
# ['h','e','l','l', 'o'] 
Powiązane problemy