改变字符串列表的格式

时间:2017-02-05 18:42:49

标签: python

我必须分析地震数据,在开始分析数据之前,我必须改变数据列表方式的格式。我必须改变格式:

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", ...]

我对原始格式(省略网址)的代码是:

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

我试图创建变量幅度和earthquakeloc来重新排列alist的格式,但我不知道从哪里开始。我对编码很新。任何建议都会很精彩,谢谢。

4 个答案:

答案 0 :(得分: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并不是很复杂,所以我使用了这种方法。

答案 1 :(得分: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']

答案 2 :(得分:0)

假设您的c - 'A'变量包含以下行:

'Z'

在最简单的情况下,使用source14km 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

答案 3 :(得分: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))