Jump to content

como transformar uma cadeia de caracteres em listas a partir de \n


msmsms
 Share

Recommended Posts

boas

tenho a seguinte cadeia:

cadeia = '1\t2\n3\t4\n'

os resultados que pretendo obter são os seguintes:

lista_linha1 = [1,2]

lista_linha2 = [3,4]

lista_coluna1 = [1,3]

lista_coluna2 = [2,4]

alguém pode ajudar e fornecer várias opções de resolver esta situação?

Edited by msmsms
Link to comment
Share on other sites

Primeiro que tudo, qual é o padrão da cadeia? É sempre um conjunto de números separados por tabulação (\t) e por parágrafo (\n)? São só dígitos e não números...? Explica melhor o padrão da cadeia que te pode aparecer.

Primeiro que tudo, qual é o padrão da cadeia? É sempre um conjunto de números separados por tabulação (\t) e por parágrafo (\n)? São só dígitos e não números...? Explica melhor o padrão da cadeia que te pode aparecer.

eu é que simplifiquei mas os números até podem poder ser float

tentei ir por indices e genero pensar que os numeros a colocar em listas seriam os em posição par, excluindos os \t e \n que seriam indices ímpares mas se os números forem float como têm de ser para resolver o problema que estou a tentar resolver ai já não dá 😞

genero se for a cadeia = '22.3\t44.4\n45.2\t46.5' (a cadeia real não é assim tão compacta ''é enorme mas segue estas ordem

- mesmo números de digitos em cada número xx.x

- mesmo numero de linhas

- mesmo numero de colunas,

tal como uma matriz

a menos que arranja-se um padrão com 3 indices pegados que corresponderia a um numero no formato XX.X porque todos os números do exercício são assim

Edited by msmsms
Link to comment
Share on other sites

Não. A solução é utilizares o método split. Exemplo:

>>> 'ola, eu sou o thoga31'.split(" ")
['ola', 'eu', 'sou', 'o', 'thoga31']

Não. A solução é utilizares o método split. Exemplo:

>>> 'ola, eu sou o thoga31'.split(" ")
['ola', 'eu', 'sou', 'o', 'thoga31']

eu pensei nesse metodo mas assim vou juntar as linhas e as colunas como se fossem coisas iguais

e o objecto final é obter o maior número e o menor ao nível numero das linhas e o das colunas

Link to comment
Share on other sites

Quem disse que vais juntar tudo como se fossem coisas iguais? Não te esqueças que tens na tua cadeia dois sítios por onde separar! Tens \n e \t! Se tens sempre a mesma quantidade de números em cada linha então o problema torna-se simples de resolver: fazes um split pelas linhas, depois fazes split a cada um desses elementos pelo \t e ficas com os números das linhas. Obtens as colunas por inversão. Dica para isto: a primeira coluna é constituída pelos primeiros elementos de cada linha, e assim sucessivamente.

Knowledge is free!

Link to comment
Share on other sites

cadeia = '1\t2\n3\t4\n'
cadeia_2 = cadeia.split('\n')
contagem = 0
for i in cadeia_2:
    print 'lista_linha' + str(contagem)  + str(i.split('\t'))
    contagem += 1

Agora é só fazer o mesmo para as colunas, descobre sozinho 😛 Se tiveres duvidas é só postares.

Edit: Podes usar "cadeia_2.remove('')" para removeres aquela string em branco nessa lista. Assim só te apareçe o que tu queres.

Edited by thoga31
GeSHi
Link to comment
Share on other sites

mas o split pode levar argumentos? e como?

Basicamente, a sintaxe é esta:

string.split(caracter)

Passas por parâmetro o caracter por onde queres cortar a tua string, e esse caracter é excluído por defeito.

Para o exercício forneço uma ideia adicional. Que tal obter os números neste formato:

l = [['1', '2'], ['3', '4']]

Cada elemento da lista principal é uma linha, e as colunas são dadas por:

[[linha[i] for linha in l] for i in range(len(l[0]))]

Isto considerando que todas as linhas têm o mesmo número de elementos, sendo, então, uma matriz.

Knowledge is free!

Link to comment
Share on other sites

tentei fazer por linhas e consegui por colunas não consigo de forma alguma

def linhas():

   cadeia = '22.3\t44.4\n45.2\t46.5'
   linhas = cadeia.split('\n')

   lista =[]
   for i in range(len(linhas)):
    lista = lista + linhas[i].split('\t')
   print max(lista), min(lista)

def colunas():
   cadeia = '22.3\t44.4\n45.2\t46.5'
   colunas = cadeia.split('\t')

   lista =[]
   for i in range(len(colunas)):
    lista = lista + colunas[i].split('\n')
   print lista # não é a lista de colunas certa

if __name__ == '__main__':
   linhas()
   colunas()
Link to comment
Share on other sites

Se fizeres split em \t obténs ['22.3', '44.4\n45.2', '46.5'] e depois um split em \n num ciclo for como fizeste só vão resultar na lista de números.

Tens de voltar a fazer split em \n e depois fazer split em \t de modo a obteres isto: [['22.3', '44.4'], ['45.2', '46.5']]:

lista = [elem.split('\t') for elem in cadeia.split('\n')]

Como podes ver tens duas listas dentro de uma lista, e cada uma delas é uma linha. Para obteres as colunas só terás de obter os valores de cada índice i de todas as linhas.

Por exemplo, obtendo a coluna 0, vais buscar lista[0][0] e lista[0][1].

Pensa lá um pouco nisto, e vê bem o código que já te dei para obter as colunas todas de uma lista.

Edited by thoga31

Knowledge is free!

Link to comment
Share on other sites

Se fizeres split em \t obténs ['22.3', '44.4\n45.2', '46.5'] e depois um split em \n num ciclo for como fizeste só vão resultar na lista de números.

Tens de voltar a fazer split em \n e depois fazer split em \t de modo a obteres isto: [['22.3', '44.4'], ['45.2', '46.5']]:

lista = [elem.split('\t') for elem in cadeia.split('\n')]

Como podes ver tens duas listas dentro de uma lista, e cada uma delas é uma linha. Para obteres as colunas só terás de obter os valores de cada índice i de todas as linhas.

Por exemplo, obtendo a coluna 0, vais buscar lista[0][0] e lista[0][1].

Pensa lá um pouco nisto, e vê bem o código que já te dei para obter as colunas todas de uma lista.

eu fiz de modo a obter [['22.3', '44.4'], ['45.2', '46.5']]

mas ai vou ter de obter [['22.3','45.2'],['44,4','46,5']] e não consigo

se for por índice será algo muito manual e numa cadeia com 100 linhas e sabe-se quantas colunas ia ser muito demorado e confuso obter os indices de tudo.

def colunas():

cadeia = '22.3\t44.4\n45.2\t46.5'
split = cadeia.split('\n')

lista = []
for elem in split:
	linhas = elem.split('\t')
	lista = lista + linhas
return lista # = [['22.3', '44.4'], ['45.2', '46.5']]


if __name__=='__main__':
print colunas()
Edited by msmsms
Link to comment
Share on other sites

O teu código está quase correcto. Parece-me que o único problema está aqui: lista = lista + linhas

Quando estás a somar duas (ou mais) listas o resultado em python é de facto apenas uma que contem os elementos de todas envolvidas no somatório:

In [1]: a = ['1','2']
In [2]: b = ['3','4']
In [3]: a+b
Out[3]: ['1', '2', '3', '4']

Para adicionares a uma lista um elemento (que até pode ser outra lista) usa o comando append():

def colunas():
 cadeia = '22.3\t44.4\n45.2\t46.5'
 split = cadeia.split('\n')

 lista = []
 for elem in split:
	 linhas = elem.split('\t')
	 lista.append(linhas) #lista = lista + linhas
 return lista # = [['22.3', '44.4'], ['45.2', '46.5']]

if __name__=='__main__':
 print colunas()

Penso que isto deverá resolver o teu problema.

Link to comment
Share on other sites

Dada a cadeia:

cadeia = '22.3\t44.4\n45.2\t46.5'

Obtém-se a tabela inicial com:

tabela = [elem.split('\t') for elem in cadeia.split('\n')]

E, a partir da tabela, obtém-se as colunas (inverte-se linhas por colunas e vice-versa) desta forma:

tab_inv = [[l[i] for l in tabela] for i in range(len(tabela[0]))]

Isto considerando que todas as linhas da tabela têm o mesmo número de elementos, caso contrário este código não funcionará.

Por fim, para imprimir os dados gerados:

# Python 3.x

print('Tabela original:')
for linha in tabela:
   print(*linha, sep='; ')

print('Tabela invertida:')
for linha in tab_inv:
   print(*linha, sep='; ')

Output que obtive:

Tabela original:
22.3; 44.4
45.2; 46.5

Tabela invertida:
22.3; 45.2
44.4; 46.5

A cadeia pode variar por completo - desde que cada linha tenha o mesmo número de elementos, este código dar-nos-á sempre a tabela original e a invertida.

Dado isto, já alguém percebeu alguma coisa do que eu estava a dizer? Não se queixem, acabei de dar a papinha toda feita pela primeira vez desde que sou membro do P@P!

Knowledge is free!

Link to comment
Share on other sites

O teu código está quase correcto. Parece-me que o único problema está aqui: lista = lista + linhas

Quando estás a somar duas (ou mais) listas o resultado em python é de facto apenas uma que contem os elementos de todas envolvidas no somatório:

In [1]: a = ['1','2']
In [2]: b = ['3','4']
In [3]: a+b
Out[3]: ['1', '2', '3', '4']

Para adicionares a uma lista um elemento (que até pode ser outra lista) usa o comando append():

def colunas():
 cadeia = '22.3\t44.4\n45.2\t46.5'
 split = cadeia.split('\n')

 lista = []
 for elem in split:
	 linhas = elem.split('\t')
	 lista.append(linhas) #lista = lista + linhas
 return lista # = [['22.3', '44.4'], ['45.2', '46.5']]

if __name__=='__main__':
 print colunas()

Penso que isto deverá resolver o teu problema.

O teu código está quase correcto. Parece-me que o único problema está aqui: lista = lista + linhas

Quando estás a somar duas (ou mais) listas o resultado em python é de facto apenas uma que contem os elementos de todas envolvidas no somatório:

In [1]: a = ['1','2']
In [2]: b = ['3','4']
In [3]: a+b
Out[3]: ['1', '2', '3', '4']

Para adicionares a uma lista um elemento (que até pode ser outra lista) usa o comando append():

def colunas():
 cadeia = '22.3\t44.4\n45.2\t46.5'
 split = cadeia.split('\n')

 lista = []
 for elem in split:
	 linhas = elem.split('\t')
	 lista.append(linhas) #lista = lista + linhas
 return lista # = [['22.3', '44.4'], ['45.2', '46.5']]

if __name__=='__main__':
 print colunas()

Penso que isto deverá resolver o teu problema.

so que as colunas da cadeia '22.3\t44.4\n45.2\t46.5' são [22.3, 45.2] e [44.4, 46.5]

e isso que tu fizes-te vai dar as linhas que era feito de outra forma e não as colunas

Link to comment
Share on other sites

Certo. Mas também já te foi dada a solução ao teu problema das colunas.

Certo. Mas também já te foi dada a solução ao teu problema das colunas.

nao ha forma de fazer a lista de compreensao: tab_inv = [[l for l in tabela] for i in range(len(tabela[0]))]

ficar sem indices (ser antes por elem)

eu nao percebo a parte do l for l in tabela]

e porquê tabela[0]?

Edited by msmsms
Link to comment
Share on other sites

nao ha forma de fazer a lista de compreensao: tab_inv = [[l[ i] for l in tabela] for i in range(len(tabela[0]))]

ficar sem indices (ser antes por elem)

Talvez haja, só pensando melhor.

eu nao percebo a parte do l[ i] for l in tabela]

e porquê tabela[0]?

Tens de ler a listcomp como um todo. Vejamos:

[[l[i] for l in tabela] for i in range(len(tabela[0]))]

1º - esta listcomp devolve uma list of list, ou seja, algo como [[0, 1], [2, 3]].

2º - visto que todas as linhas da tabela têm o mesmo nº de elementos, basta pegares numa das linhas (a tabela[0] deve existir obrigatoriamente, não sabes se tabela[30] existe, por exemplo) para saberes quantos elementos tem cada linha: len(tabela[0]) devolve-te o nº de elementos da linha 0 da tabela.

3º - for i in range(len(tabela[0])) dá-te um índice i que te aponta para cada um dos elementos de uma linha.

4º - deves devolver uma lista com o iº elemento de cada linha: [l for l in tabela]. for l in tabela devolve-te em l cada linhda da tabela, e l[ i] dá-te o iº elemento dessa linha.

Exemplo:

[[0, 1, 2],
[3, 4, 5]]

Determinamos com len(tabela[0]) que cada linha tem 3 elementos. Começando com i = 0, criamos uma lista com o 0º elemento de cada linha: o 0º elemento da primeiro linha é o 0 e o da 2ª linha é o 3 - é devolvido [0, 3].

De seguida vamos ao 1º elemento de cada linha: obtemos [1, 4]. E com o 2º obtemos [2, 5].

A listcomp devolve uma lista com estas sublistas:

[[0, 3],
[1, 4],
[2, 5]]

Entendeste? 🙂

Edited by thoga31

Knowledge is free!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.