2016-05-12 48 views
0

我想要一些快速脚本的python。简单的表格操作使用python

我已经创建NX3阵列等

[["file_name1", "func_name1", 0], 
["file_name1", "func_name2", 1], 
["file_name2", "func_name1", 0], 
["file_name3", "func_name1", 1]] 

我已经提取通过循环运行的单个元素,并加入到像上面的列表。我必须通过将特定file_name的所有布尔值相加来创建报告。我怎么做?请帮忙。

提取代码:

db = [] 
#extract the file_name, api_name 
    for line in open("apiList.txt"): 
    columns = line.split(" ") 
    r = re.compile('file_(.*?).c') 
    m = r.search(columns[-1]) 
    if m: 
     file_name = m.group(1) 

    func_name = columns[-2] 
    flag = 0 
    db.append([file_name,func_name,flag]) 

apilist.txt:

void init ..\src\file_mod1.c 
void test ..\src\file_mod1.c 
+1

可以显示apiList.txt或至少格式? – Keatinge

+0

你希望代码做什么?它做什么呢?有什么不同?如果你不解释问题是什么,只是显示代码没有帮助。 – BrenBarn

+0

我已经用apilist.txt更新了OP。实际上保存到列表工作正常..我不知道如何在保存后处理列表。下一步是读取输出日志文件并查看func_name是否存在。如果存在我要更新标志为1 ..最后我要创建一个报告,说这些许多功能得到执行,这些没有.. – Vinoth

回答

1

要找到所有具有特定名称的元素:

FILE_NAME=0 
FUNC_NAME=1 
BOOL_VALUE=2 

db = [ 
    ["file_name1", "func_name1", 0], 
    ["file_name1", "func_name2", 1], 
    ["file_name2", "func_name1", 0], 
    ["file_name3", "func_name1", 1], 
] 

list_fn1 = [grp for grp in db if grp[FILE_NAME] == "file_name1"] 

sum_fn1 = sum([e[BOOL_VALUE] for e in list_fn1]) 

从你的另一评论:

import random 
new_bool = random.choice([True, False]) 

# This works because the sublists are shared (obj=ref) between the two lists.  
for e in list_fn1: 
    e[BOOL_VALUE] = new_value 

# This is the hard way: 
for e in db: 
    if e[FILE_NAME] == "file_name1": 
     e[BOOL_VALUE] = new_Value 
1

字典将由我就去。这将创建一个字典,测试file_name是否存在,以及是否添加标志,如果没有设置标志。

>>> lst = [["file_name1", "func_name1", 0], 
      ["file_name1", "func_name2", 1], 
      ["file_name2", "func_name1", 0], 
      ["file_name3", "func_name1", 1]] 
>>> dic = {} 
>>> for each in lst: 
     if each[0] in dic: 
     dic[each[0]] += each[2] 
     else: 
     dic[each[0]] = each[2] 

输出:

>>> dic 
{'file_name1': 1, 'file_name3': 1, 'file_name2': 0} 
+0

谢谢。这应该工作。我还有一个问题:如何通过func_name搜索来更新列表中的标志值? – Vinoth

+0

我不明白你的意思,对于每个file_name,您希望每次记录func_name时都记录它们? – Tony

1

使用,其中第一列包含file_name2和第二列pandas

import pandas as pd 
>>> data = [["file_name1", "func_name1", 0], 
... ["file_name1", "func_name2", 1], 
... ["file_name2", "func_name1", 0], 
... ["file_name3", "func_name1", 1]] 
>>> df = pd.DataFrame(data) 
>>> res = df.groupby(0).size() 
>>> res['file_name1'] 
2 
>>> res['file_name2'] 
1 
>>> res['file_name3'] 
1 
>>> 

更改标志包含func_name1

>>> df.iloc([(df[0]=='file_name2') & (df[1]=='func_name1')])[2] = 1 
+0

谢谢。这应该工作。我不确定这一点:我需要在file_name2中搜索数据中的func_name1,并将标志值更新为1.我该怎么做? – Vinoth

+1

请检查编辑的答案。 – qmaruf

+0

有没有办法在不使用熊猫的情况下搜索和更新列表? – Vinoth