2017-02-05 4 views
0

Ich muss Erdbebendaten analysieren, und bevor ich mit der Analyse der Daten beginnen kann, muss ich das Format ändern, in dem die Daten aufgelistet werden. Ich muss das Format ändern von:Ändern des Formats einer Liste von Strings

14km WSW of Willow, Alaska$2.4 
4km NNW of The Geysers, California$0.9 
13km ESE of Coalinga, California$2.1 
... 

zu:

["2.4, 14km WSW of Willow, Alaska", "0.9, 4km NNW of The Geysers, California", 
"2.1, 13km ESE of Coalinga, California", ...] 

Der Code, den ich für das ursprüngliche Format haben (Weglassen der url) ist:

def fileToList(url): 
    alist = [] 
    source = urllib2.urlopen(url) 
    for line in source: 
     items = line.strip() 
     alist.append(items) 
    return alist 

Ich bin versuchen, Variablen Größe und Erdbeben zu schaffen, um das Format von Alist neu zu ordnen, aber ich weiß nur nicht, wo ich anfangen soll. Ich bin sehr neu in der Codierung. Irgendwelche Vorschläge wären wunderbar, danke.

Antwort

0

Hinweis:

>>> a = "14km WSW of Willow, Alaska$2.4" 
>>> a = a.split("$") split the string on `$` 
>>> a 
['14km WSW of Willow, Alaska', '2.4'] 
>>> a = a[::-1]  reverse the list  
>>> a 
['2.4', '14km WSW of Willow, Alaska'] 
>>> ",".join(a)   give jon on `,` 
'2.4,14km WSW of Willow, Alaska' 

Motto:

>>> ",".join(a.split("$")[::-1]) 
'2.4,14km WSW of Willow, Alaska' 

Pythonic Weg für Ihre erwartete Ausgabe:

>>> myString = """14km WSW of Willow, Alaska$2.4 
... 4km NNW of The Geysers, California$0.9 
... 13km ESE of Coalinga, California$2.1""" 
>>> map(lambda x: ",".join(x.split("$")[::-1]), myString.strip().split("\n")) 
['2.4,14km WSW of Willow, Alaska', '0.9,4km NNW of The Geysers, California', '2.1,13km ESE of Coalinga, California'] 
+0

Dies war hilfreich, um die Informationen in die richtige Reihenfolge zu bringen, wobei die Stärke des Erdbebens zuerst von der Position gefolgt wurde, aber aus irgendeinem Grund schien die .join() nicht daran zu arbeiten, die Informationen in eine Liste von Strings umzuwandeln Erdbeben. –

+0

Meine Ausgabe sieht so aus: ['2.4', '14km WSW von Willow, Alaska'] \ n ['0.9', '4km NNW of The Geysers, Kalifornien'] \ n ['2.1', '13km ESE of Coalinga, California '] \ n ... aus diesem Code: def fileToList (url): alist = [] source = urllib2.urlopen (url) für die Zeile in der Quelle: items = line.strip(). Split ("$") alist .append (items [:: - 1]) return alist –

+0

Wie bekomme ich ["2.4, 14km WSW von Willow, Alaska", "0.9, 4km NNW von The Geysers, California", "2.1, 13km ESE von Coalinga, Kalifornien ", ...] als meine Ausgabe? –

0

Wenn Sie die Formatierung besorgt sind, dann würde ich einen collections.namedtuple als Zwischenwert verwenden:

from collections import namedtuple 

Data = namedtuple('Data', ['position', 'magnitude']) 

mystr = """14km WSW of Willow, Alaska$2.4 
4km NNW of The Geysers, California$0.9 
13km ESE of Coalinga, California$2.1""" 

list_of_data = [] 
for line in mystr.split('\n'): # equivalent to your "for line in source" 
    list_of_data.append(Data(*line.split('$'))) 

Dies wird Ihnen folgendes:

>>> list_of_data 
[Data(position='14km WSW of Willow, Alaska', magnitude='2.4'), 
Data(position='4km NNW of The Geysers, California', magnitude='0.9'), 
Data(position='13km ESE of Coalinga, California', magnitude='2.1')] 

, die leicht manipuliert werden kann:

>>> ['{x.magnitude}, {x.position}'.format(x=x) for x in list_of_data] 
['2.4, 14km WSW of Willow, Alaska', 
'0.9, 4km NNW of The Geysers, California', 
'2.1, 13km ESE of Coalinga, California'] 

oder nach Größe sortiert:

>>> sorted(list_of_data, key=lambda x: x.magnitude) 
[Data(position='4km NNW of The Geysers, California', magnitude='0.9'), 
Data(position='13km ESE of Coalinga, California', magnitude='2.1'), 
Data(position='14km WSW of Willow, Alaska', magnitude='2.4') 

Am Ende wäre es wahrscheinlich sinnvoller, einen Regex zu verwenden, wenn Ihr Datensatz riesig ist. Aber das Parsen der Daten mit str.split und Speichern in namedtuples ist nicht sehr kompliziert zu verstehen, also habe ich diesen Ansatz verwendet.

+0

Sie brauchen nicht den Aufwand des 'namedtuple' eine' list' von einem Split zu erstellen. Eine Liste von NamedTuple's ist nicht das Format, nach dem das OP gefragt hat. –

+0

Aber man kann das angeforderte Format erstellen (siehe '['{x.magnitude}, {x.position}'. Format (x = x) für x in list_of_data]'). Auch wenn Sie 'Nametuples' als Overhead betrachten, machen Sie einen großen Fehler. In diesem Fall gibt es eine klare Bedeutung für die Teile der Zeichenkette. Warum also lieber eine unbenannte "Liste" oder "Tupel"? – MSeifert

+0

Namedtuple fügt tatsächlich Overhead hinzu: Sie müssen die NamedTuple-Definition nachschlagen. Und jedes Mal, wenn Sie auf ein Feld in einem benannten Tupel zugreifen, haben Sie nicht nur die Attributsuche, sondern auch die Indexsuche. Also für eine Liste, in der Sie in namedtuple-Attributen ersetzen, haben Sie einen sehr realen Overhead. Siehe: http://Stackoverflow.com/questions/2646157/what-is-the-fastest-to-access-struct-like-object-in-python –

0

Lassen Sie uns sagen, dass Ihre source Variable enthält die folgenden Zeilen:

14km WSW of Willow, Alaska$2.4 
4km NNW of The Geysers, California$0.9 
13km ESE of Coalinga, California$2.1 

In einfachsten Fall würde es ausreichen, str.split und str.join Funktionen zu verwenden:

def fileToList(url=''): 
    source = urllib2.urlopen(url) 

    return [', '.join(l.split('$')[::-1]) for l in source.split('\n') if l.strip()] 

print(fileToList()) 

Der Ausgang wie unten sein sollte:

['2.4, 14km WSW of Willow, Alaska', '0.9, 4km NNW of The Geysers, California', '2.1, 13km ESE of Coalinga, California'] 
0

Es scheint, dass Sie versuchen, nur neu ordnen die Art und Weise, wie jeder String formatiert wird. Wenn Sie also die Anfangsdaten in einem mehrzeiligen String haben:

earthquake_data = """14km WSW of Willow, Alaska$2.4 
4km NNW of The Geysers, California$0.9 
13km ESE of Coalinga, California$2.1""" 

dann können Sie es auf den Zeilenumbrüchen geteilt eine Liste von Strings zu erhalten:

lines = data.split('\n') 
>>> ['14km WSW of Willow, Alaska$2.4', '4km NNW of The Geysers, California$0.9', '13km ESE of Coalinga, California$2.1'] 

und für jedes Element der Liste der Daten, teilen Sie es auf das Symbol ‚$‘, die eine Liste von verlassen diese Listen wie: mit dem str.join() String-Methode für jedes Element

split_lines = [l.split('$') for l in lines] 
>>> [['14km WSW of Willow, Alaska', '2.4'], ['4km NNW of The Geysers, California', '0.9'], ['13km ESE of Coalinga, California', '2.1']] 

Sie können dann jede dieser Listen zurück in Strings kommen in einer Liste Verständnis:

reformatted_data = [", ".join([l[1], l[0]]) for l in split_lines] 
>>> ['2.4, 14km WSW of Willow, Alaska', '0.9, 4km NNW of The Geysers, California', '2.1, 13km ESE of Coalinga, California'] 

Hier ist alles in einer Funktion verpackt:

def reformatStrings(data): 
    lines = data.split("\n") 
    split_lines = [l.split('$') for l in lines] 
    reformatted_data = [", ".join([l[1], l[0]]) for l in split_lines] 
    return reformatted_data 


print(reformatStrings(earthquake_data)) 
Verwandte Themen