将字符串列读入列表

时间:2019-07-16 11:59:20

标签: python string list

让我们说我有以下字符串

s = """WaveL         C[0,0].Pow     C[0,0].Pow(s)  C[0,0].Pow(p)  Balance        \n400            0.4411         0.4411         1.7698E-008    0.51322       \n700            0.61133        0.61133        4.0576E-007    0.88026"""

print(s)
> WaveL         C[0,0].Pow     C[0,0].Pow(s)  C[0,0].Pow(p)  Balance    
> 400            0.4411         0.4411         1.7698E-008    0.51322   
> 700            0.61133        0.61133        4.0576E-007    0.88026

现在我想将列的值放入列表。如果我将字符串存储为文本文件,然后使用np.genfromtxt()打开它,它将起作用,但是我看不到另一种简单的方法(没有那么多的开销)...

with open('temp.text', 'w') as file: file.write(s)
        file.close()


data = np.genfromtxt('temp.text')


row1 = data[1:,0]
row2 = data[1:,1]

os.remove('temp.text')

您知道我该怎么做吗?

编辑:

对那些回答我如何获得行的家伙们表示抱歉。我实际上是想问如何获得这些专栏。很抱歉这个错误。

3 个答案:

答案 0 :(得分:2)

在列表理解中使用str.splitlinesstr.split

例如:

s = """WaveL         C[0,0].Pow     C[0,0].Pow(s)  C[0,0].Pow(p)  Balance        \n400            0.4411         0.4411         1.7698E-008    0.51322       \n700            0.61133        0.61133        4.0576E-007    0.88026"""
result = [row.split() for row in s.splitlines()]
print(result)

输出:

[['WaveL', 'C[0,0].Pow', 'C[0,0].Pow(s)', 'C[0,0].Pow(p)', 'Balance'],
 ['400', '0.4411', '0.4411', '1.7698E-008', '0.51322'],
 ['700', '0.61133', '0.61133', '4.0576E-007', '0.88026']]

根据评论更新。

from collections import defaultdict
s = """WaveL         C[0,0].Pow     C[0,0].Pow(s)  C[0,0].Pow(p)  Balance        \n400            0.4411         0.4411         1.7698E-008    0.51322       \n700            0.61133        0.61133        4.0576E-007    0.88026"""
result = defaultdict(list)
for row in s.splitlines():
    for i, r in enumerate(row.split()):
        result[i].append(r)

result = {v[0]: list(map(float, v[1:])) for _, v in result.items()}     
print(result)

输出:

{'Balance': [0.51322, 0.88026],
 'C[0,0].Pow': [0.4411, 0.61133],
 'C[0,0].Pow(p)': [1.7698e-08, 4.0576e-07],
 'C[0,0].Pow(s)': [0.4411, 0.61133],
 'WaveL': [400.0, 700.0]}

答案 1 :(得分:1)

如果您坚持要求输出为numpy数组,则可以执行以下操作。

s = """ .... """

np.array(s.split('\n', 1)[1])

该字符串被分成几行,但仅一次。您使用结果列表的第二个元素,最后将此字符串转换为numpy数组。

答案 2 :(得分:1)

如果要在没有任何其他库的情况下执行此操作,则可以提取标题,然后在各行中进行迭代。

lines = [l for l in s.splitlines()]
cols={}
for col in lines[0].split(): cols[col]=[]

keys=list(cols.keys())

for i, col in enumerate(lines[1:]):
    for e,i in enumerate(col.split()):
        cols[keys[e]].append(i) #.append(float(i))

这将为您提供字典,您可以在其中选择各个列:

{'WaveL': ['400', '700'],
 'C[0,0].Pow': ['0.4411', '0.61133'],
 'C[0,0].Pow(s)': ['0.4411', '0.61133'],
 'C[0,0].Pow(p)': ['1.7698E-008', '4.0576E-007'],
 'Balance': ['0.51322', '0.88026']

如果您要处理大文件,这可能并不太高效,并且您的最佳使用可能是使用适当的反序列化(例如,查看CSV文件阅读器,例如csvpandas.read_csv中的-比genfromtxt更强大)