从数据文件创建列表
Creating lists from data file
我有一个预定义的列表,它以(最小值、最大值、增量)的形式提供数据。例如:
[[0.0 1.0 0.1 #mass
1.0 5.0 1.0 #velocity
45.0 47.0 1.0 #angle in degrees
0.05 0.07 0.1 #drag coeff.
0.0 0.0 0.0 #x-position
0.0 0.0 0.0]] #y-postion
这将继续进行更多变量。理想情况下,我想将每一个都作为一个单独的变量声明,并为给定范围内的每个值创建一个有限列表。
例如,质量为:
m = [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
这样我就可以利用 itertools.combinations((m, x, b,...), r)
给定每个变量的各种可能性来创建所有可能的组合。
有什么建议吗?
你把列表写成一个平面列表,所有数字都在同一水平
[[0.0 1.0 0.1 1.0 5.0 1.0 45.0 47.0 1.0 ...]]
但您可能打算将其写成嵌套列表
[[0.0, 1.0, 0.1], [1.0, 5.0, 1.0], [45.0, 47.0, 1.0], ...]
所以我将展示这两种解决方案。请让我知道您的 data/list 实际结构如何。
Python的range
函数不支持浮点数,但是你可以使用NumPy的arange
.
try ... except
部分用于您不变的值,例如 0.0 0.0 0.0 #x-position
。
平面列表解决方案:
flat_list = [0.0, 1.0, 0.1,
1.0, 5.0, 1.0,
45.0, 47.0, 1.0,
0.05, 0.07, 0.1,
0.0, 0.0, 0.0,
0.0, 0.0, 0.0]
import numpy as np
incremented_lists = []
for i in range(0, len(flat_list), 3): # Step in threes
minimum, maximum, increment = flat_list[i:i+3]
try:
incremented_list = list(np.arange(minimum, maximum + increment, increment))
except ZeroDivisionError:
incremented_list = [minimum]
incremented_lists.append(incremented_list)
嵌套列表解决方案:
nested_list = [[0.0, 1.0, 0.1],
[1.0, 5.0, 1.0],
[45.0, 47.0, 1.0],
[0.05, 0.07, 0.1],
[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0]]
import numpy as np
incremented_lists = []
for sub_list in nested_list:
minimum, maximum, increment = sub_list
try:
incremented_list = list(np.arange(minimum, maximum + increment, increment))
except ZeroDivisionError:
incremented_list = [minimum]
incremented_lists.append(incremented_list)
运行 Python 2.7 或 Python 3.3 中的任何一个得到这个:
incremented_lists: [[0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
[1.0, 2.0, 3.0, 4.0, 5.0],
[45.0, 46.0, 47.0],
[0.05, 0.15],
[0.0],
[0.0]]
[0.05, 0.15]
可能是不受欢迎的,但我认为你的阻力系数 0.1 的巨大增量更可能是错字,而不是我应该让代码处理的东西。如果您希望代码处理不自然的增量并避免超过最大值,请告诉我。一种处理方法是在 incremented_lists.append(incremented_list)
之前添加 incremented_list = [x for x in incremented_list if x <= maximum]
,但我确信有更简洁的方法来做到这一点。
我想不出任何支持您所需输入的现有格式 -- 以空格作为分隔符、换行符分隔子列表,以及真正有意义的注释,因为您似乎希望定义子列表的名称。所以,我认为你必须编写自己的解析器,例如:
import re, numpy as np
res_dict = {}
with open('thefile.txt') as f:
for line in f:
mo = re.match(r'[?[(\S+)\s*(\S+)\s*(\S+)\s*#(\w)', line)
keybase = mo.group(4)
keyadd = 0
key = keybase
while key in res_dict:
key = '{}{}'.format(keybase, keyadd)
keyadd += 1
res_dict[key] = np.arange(
float(mo.group(1)),
float(mo.group(2)),
float(mo.group(3)),
)
这不会像您提到的那样为您提供顶级变量 m
,而是结构更好、更健壮的 res_dict['m']
。如果您坚持让您的代码变得脆弱,您可以globals().update(res_dict)
做到这一点:-)...
不确定你的列表结构,如果你确实需要切片,你可以使用 itertools.islice 并将所有列表存储在字典中:
from itertools import islice
l = iter([0.0, 1.0, 0.1, #mass
1.0, 5.0, 1.0,#velocity
45.0 ,47.0, 1.0, #angle in degrees
0.05, 0.07, 0.1, #drag coeff.
0.0, 0.0 ,0.0 ,#x-position
0.0 ,0.0, 0.0])#y-postion
d = {}
import numpy as np
for v in ("m","v","and","drg","x-p","y-p"): # put all "variable" names in order
start, stop , step = islice(l, None, 3)
# or use next()
# start, stop , step = next(l), next(l), next(l)
if stop > start: # make sure we have a step to take
# create key/value pairing
d[v] = np.arange(start, stop + 1,step)
else:
# add empty list for zero values
d[v] = []
print(d)
{'x-p': [], 'drg': array([ 0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85,
0.95, 1.05]), 'and': array([ 45., 46., 47.]), 'v': array([ 1., 2., 3., 4., 5.]), 'y-p': [], 'm': array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ,
1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9])}
您还可以创建自己的范围,以浮动为步长:
def float_range(start=0, stop=None, step=1):
while start <= stop:
yield start
start += step
然后用list(start, stop,step)
调用,但是因为Floating Point Arithmetic: Issues and Limitations
所以在处理float的时候需要小心
我有一个预定义的列表,它以(最小值、最大值、增量)的形式提供数据。例如:
[[0.0 1.0 0.1 #mass
1.0 5.0 1.0 #velocity
45.0 47.0 1.0 #angle in degrees
0.05 0.07 0.1 #drag coeff.
0.0 0.0 0.0 #x-position
0.0 0.0 0.0]] #y-postion
这将继续进行更多变量。理想情况下,我想将每一个都作为一个单独的变量声明,并为给定范围内的每个值创建一个有限列表。
例如,质量为:
m = [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
这样我就可以利用 itertools.combinations((m, x, b,...), r)
给定每个变量的各种可能性来创建所有可能的组合。
有什么建议吗?
你把列表写成一个平面列表,所有数字都在同一水平
[[0.0 1.0 0.1 1.0 5.0 1.0 45.0 47.0 1.0 ...]]
但您可能打算将其写成嵌套列表
[[0.0, 1.0, 0.1], [1.0, 5.0, 1.0], [45.0, 47.0, 1.0], ...]
所以我将展示这两种解决方案。请让我知道您的 data/list 实际结构如何。
Python的range
函数不支持浮点数,但是你可以使用NumPy的arange
.
try ... except
部分用于您不变的值,例如 0.0 0.0 0.0 #x-position
。
平面列表解决方案:
flat_list = [0.0, 1.0, 0.1,
1.0, 5.0, 1.0,
45.0, 47.0, 1.0,
0.05, 0.07, 0.1,
0.0, 0.0, 0.0,
0.0, 0.0, 0.0]
import numpy as np
incremented_lists = []
for i in range(0, len(flat_list), 3): # Step in threes
minimum, maximum, increment = flat_list[i:i+3]
try:
incremented_list = list(np.arange(minimum, maximum + increment, increment))
except ZeroDivisionError:
incremented_list = [minimum]
incremented_lists.append(incremented_list)
嵌套列表解决方案:
nested_list = [[0.0, 1.0, 0.1],
[1.0, 5.0, 1.0],
[45.0, 47.0, 1.0],
[0.05, 0.07, 0.1],
[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0]]
import numpy as np
incremented_lists = []
for sub_list in nested_list:
minimum, maximum, increment = sub_list
try:
incremented_list = list(np.arange(minimum, maximum + increment, increment))
except ZeroDivisionError:
incremented_list = [minimum]
incremented_lists.append(incremented_list)
运行 Python 2.7 或 Python 3.3 中的任何一个得到这个:
incremented_lists: [[0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
[1.0, 2.0, 3.0, 4.0, 5.0],
[45.0, 46.0, 47.0],
[0.05, 0.15],
[0.0],
[0.0]]
[0.05, 0.15]
可能是不受欢迎的,但我认为你的阻力系数 0.1 的巨大增量更可能是错字,而不是我应该让代码处理的东西。如果您希望代码处理不自然的增量并避免超过最大值,请告诉我。一种处理方法是在 incremented_lists.append(incremented_list)
之前添加 incremented_list = [x for x in incremented_list if x <= maximum]
,但我确信有更简洁的方法来做到这一点。
我想不出任何支持您所需输入的现有格式 -- 以空格作为分隔符、换行符分隔子列表,以及真正有意义的注释,因为您似乎希望定义子列表的名称。所以,我认为你必须编写自己的解析器,例如:
import re, numpy as np
res_dict = {}
with open('thefile.txt') as f:
for line in f:
mo = re.match(r'[?[(\S+)\s*(\S+)\s*(\S+)\s*#(\w)', line)
keybase = mo.group(4)
keyadd = 0
key = keybase
while key in res_dict:
key = '{}{}'.format(keybase, keyadd)
keyadd += 1
res_dict[key] = np.arange(
float(mo.group(1)),
float(mo.group(2)),
float(mo.group(3)),
)
这不会像您提到的那样为您提供顶级变量 m
,而是结构更好、更健壮的 res_dict['m']
。如果您坚持让您的代码变得脆弱,您可以globals().update(res_dict)
做到这一点:-)...
不确定你的列表结构,如果你确实需要切片,你可以使用 itertools.islice 并将所有列表存储在字典中:
from itertools import islice
l = iter([0.0, 1.0, 0.1, #mass
1.0, 5.0, 1.0,#velocity
45.0 ,47.0, 1.0, #angle in degrees
0.05, 0.07, 0.1, #drag coeff.
0.0, 0.0 ,0.0 ,#x-position
0.0 ,0.0, 0.0])#y-postion
d = {}
import numpy as np
for v in ("m","v","and","drg","x-p","y-p"): # put all "variable" names in order
start, stop , step = islice(l, None, 3)
# or use next()
# start, stop , step = next(l), next(l), next(l)
if stop > start: # make sure we have a step to take
# create key/value pairing
d[v] = np.arange(start, stop + 1,step)
else:
# add empty list for zero values
d[v] = []
print(d)
{'x-p': [], 'drg': array([ 0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85,
0.95, 1.05]), 'and': array([ 45., 46., 47.]), 'v': array([ 1., 2., 3., 4., 5.]), 'y-p': [], 'm': array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ,
1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9])}
您还可以创建自己的范围,以浮动为步长:
def float_range(start=0, stop=None, step=1):
while start <= stop:
yield start
start += step
然后用list(start, stop,step)
调用,但是因为Floating Point Arithmetic: Issues and Limitations