2017-02-05 2 views
0

Мне нужно проанализировать данные землетрясения, и прежде чем я начну анализировать данные, я должен изменить формат способа отображения данных. Я должен изменить формат с:Изменение формата списка строк

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

к:

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

код, который я имею в оригинальном формате (опуская URL) является:

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

Я пытаясь создать переменную величину и earthquakeloc, чтобы изменить формат alist, но я просто не знаю, с чего начать. Я очень новичок в кодировании. Любые предложения были бы замечательными, спасибо.

ответ

0

подсказка:

>>> 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' 

один лайнер:

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

Pythonic путь для ожидаемого выхода:

>>> 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

Это было полезно для получения информации в правильном порядке, с магнитудой землетрясения сначала с последующим местоположением, но по какой-то причине .join(), похоже, не работал, превращая информацию в список строк для каждого землетрясения. –

+0

Мой вывод выглядит так: ['2.4', '14km WSW of Willow, Alaska'] \ n ['0.9', '4km NNW of the Geysers, California'] \ n ['2.1', '13km ESE of Coalinga, California]] \ n ... из этого кода: def fileToList (url): alist = [] source = urllib2.urlopen (url) для строки в источнике: items = line.strip(). Split ("$") alist .append (items [:: - 1]) return alist –

+0

Как я могу получить ["2.4, 14km WSW of Willow, Alaska", "0.9, 4km NNW of the Geysers, California", "2.1, 13km ESE of Coalinga, Калифорния ", ...] как мой результат? –

0

Если вы беспокоитесь о форматировании, то я хотел бы использовать collections.namedtuple как промежуточное значение:

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('$'))) 

Это даст вам следующее:

>>> 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')] 

который может быть легко манипулировать:

>>> ['{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'] 

или отсортировано по величине:

>>> 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') 

В конце концов, вероятно, имеет смысл использовать регулярное выражение, если ваш набор данных огромен. Но разбор данных с str.split и сохранение его в namedtuples не так уж сложно понять, поэтому я использовал этот подход.

+0

Вам не нужно трудозатраты на 'namedtuple' создать' list' от раскола. Список 'namedtuple' не является форматом, который запросил OP. –

+0

Но можно создать запрошенный формат (см. '['{X.magnitude}, {x.position}'. Format (x = x) для x в list_of_data]'). Также, если вы думаете о 'namedtuples' как оклад, вы делаете огромную ошибку. В этом случае есть четкое значение для частей строки, поэтому почему предпочитаете безымянный «список» или «кортеж»? – MSeifert

+0

Namedtuple действительно добавляет накладные расходы: вам нужно найти определение namedtuple. И каждый раз, когда вы получаете доступ к полю в именованном кортеже, вы не только просматриваете атрибут, но и индексный поиск. Поэтому для списка, в котором вы заменяете атрибуты namedtuple, у вас есть очень реальные накладные расходы. См. Http://stackoverflow.com/questions/2646157/what-is-the-fastest-to-access-struct-like-object-in-python –

0

Допустим, ваша source переменная содержит следующие строки:

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

В самом простом случае достаточно было бы использовать str.split и str.join функции:

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

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

print(fileToList()) 

Результат должен быть, как показано ниже:

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

кажется, что вы просто пытаетесь изменить порядок как каждая строка отформатирована, поэтому, если у вас есть исходные данные в многострочной строке, например:

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

, то вы можете разделить его на переводы строк, чтобы получить список строк:

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'] 

и для каждого элемента списка данных, разделить его на символ «$», который оставит вам список списки, как это:

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']] 

Вы можете присоединиться к каждой из этих списков обратно в строки с помощью str.join() метод строки для каждого элемента в списке понимание:

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'] 

Здесь все это обернуто в функции:

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)) 
Смежные вопросы