不知道如何标题这个问题.我遇到过一些情况,我有一个数据列表,可能带有一些属性注释,我想将它们收集到组中.
例如,也许我有这样的文件:
some event
reading: 25.4
reading: 23.4
reading: 25.1
different event
reading: 22.3
reading: 21.1
reading: 26.0
reading: 25.2
another event
reading: 25.5
reading: 25.1
Run Code Online (Sandbox Code Playgroud)
并且我想对每组读数进行分组,将它们分成条件(在这种情况下,发生事件),这样我最终得到的结构就像
[['some event',
'reading: 25.4',
'reading: 23.4',
'reading: 25.1'],
['different event',
'reading: 22.3',
'reading: 21.1',
'reading: 26.0',
'reading: 25.2'],
['another event',
'reading: 25.5',
'reading: 25.1']]
Run Code Online (Sandbox Code Playgroud)
在它的通用形式中,它是:查找条件,收集数据直到该条件再次为真,重复
现在,我会做类似的事情
events = []
current_event = []
for line in lines:
if is_event(line):
if current_event:
events.append(current_event)
current_event = [line]
else:
current_event.append(line)
else:
if current_event:
events.append(current_event)
def is_event(line):
return …Run Code Online (Sandbox Code Playgroud) 我习惯于csv.Dictreader读取 csv 文件,因为通过字段名访问项目非常方便,但是该类csv.Dictwriter对于如何处理字段名非常挑剔。"dict contains fields not in fieldnames"当我特别不希望字典包含我提供的所有字段名时,我遇到了很多异常。我还希望能够提供字段名列表,其中的键可能不会出现在字典列表的每一行中。
因此,我创建了一种将字典列表转换为可以与该csv.writer.writerow函数一起使用的二维数组的方法。
问题:
我想知道我的方法是好是坏还是丑陋。有没有更好/更Pythonic的方法将具有任意字段名的字典列表转换为二维数组?我错过了一些明显的东西吗csv.DictWriter?
代码:
它的作用是:
输出将跳过您未提供的字段名称,但如果您提供的字段名称未出现在每个(或任何)行中,但仍将其包含在顶部的标题中,则输出也会仅放置一个空格。 csv 文件。
def csvdict_to_array(dictlist, fieldnames):
# Start with header row
csv_array = [fieldnames]
for row in dictlist:
csv_array.append(dictlist_row_to_list(row, fieldnames))
return csv_array
def dictlist_row_to_list(dictlist_row, fieldnames):
csv_row = []
for field in fieldnames:
if field not in dictlist_row:
csv_row.append('')
else:
csv_row.append(dictlist_row[field])
return csv_row
Run Code Online (Sandbox Code Playgroud)
输入/输出示例:
fieldnames = ["one", "three", "ten"]
dictlist = [{"one": "bob", "two": "bill", "three":"cat"},
{"one": "john", …Run Code Online (Sandbox Code Playgroud) 我的意思是,如果你覆盖一个具有相同形状列表的列表,它是否保留第一个列表?例如:
point = [1, 2]
for x in xrange(10000000):
point = [x, x + 1]
Run Code Online (Sandbox Code Playgroud)
不Python从重用列表point = [1, 2]中循环,只需在更新引用的每一次迭代point[0],并point[1]以x和x + 1?或者它是否在每次迭代中创建一个新列表并丢弃旧的列表?换句话说,就是性能相当于
point = [1, 2]
for x in xrange(10000000):
point[0] = x
point[1] = x + 1
Run Code Online (Sandbox Code Playgroud)
我只是好奇如果python在引擎盖下进行那种类型的优化
编辑:除了下面的每个人都说的,我根据自己的好奇心进行基准测试.
在我尊敬的thinkpad的Core2Duo上:
point = [1, 2]
for x in xrange(10000000):
point = [x, x + 1]
# Result:
# real 0m6.164s
point = [1, 2]
for x in xrange(10000000):
point[0] = …Run Code Online (Sandbox Code Playgroud) 说我有一个词典列表.它们在每行中大多数具有相同的键,但有一些不匹配并且具有额外的键/值对.有没有快速的方法来获取所有行中的所有键的集合?
现在我正在使用这个循环:
def get_all_keys(dictlist):
keys = set()
for row in dictlist:
keys = keys.union(row.keys())
Run Code Online (Sandbox Code Playgroud)
在具有数十万行的列表上执行此操作似乎非常低效,但我不确定如何更好地执行此操作
谢谢!
我正在尝试对 numpy 数组进行基准测试,因为当我尝试在脚本中用 numpy 数组替换 python 数组时,结果比预期的要慢。
我知道我错过了一些东西,我希望有人能澄清我的无知。
我创建了两个函数并对它们计时
NUM_ITERATIONS = 1000
def np_array_addition():
np_array = np.array([1, 2])
for x in xrange(NUM_ITERATIONS):
np_array[0] += x
np_array[1] += x
def py_array_addition():
py_array = [1, 2]
for x in xrange(NUM_ITERATIONS):
py_array[0] += x
py_array[1] += x
Run Code Online (Sandbox Code Playgroud)
结果:
np_array_addition: 2.556 seconds
py_array_addition: 0.204 seconds
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?是什么导致了大规模放缓?我想如果我使用静态大小的数组 numpy 至少会具有相同的速度。
谢谢!
numpy 数组访问速度缓慢一直困扰着我,我想“嘿,它们只是内存中的数组,对吗?Cython 应该解决这个问题!”
它做到了。这是我修改后的基准
import numpy as np
cimport numpy as np
ctypedef np.int_t DTYPE_t
NUM_ITERATIONS = 200000
def np_array_assignment():
cdef np.ndarray[DTYPE_t, ndim=1] np_array …Run Code Online (Sandbox Code Playgroud)