【问题标题】:Simple table manipulation using python使用python进行简单的表操作
【发布时间】:2016-05-12 04:31:59
【问题描述】:

我正在尝试使用 python 编写一些快速脚本。

我要创建一个像

这样的 nx3 数组
[["file_name1", "func_name1", 0],
["file_name1", "func_name2", 1],
["file_name2", "func_name1", 0],
["file_name3", "func_name1", 1]]

我已经提取了通过循环运行的各个元素并添加到上面的列表中。我必须通过对特定文件名的所有布尔值求和来创建报告。我怎么做?请帮忙。

提取码:

 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

【问题讨论】:

  • 你能显示 apiList.txt 或至少格式吗?
  • 您希望该代码做什么?相反,它做了什么?有什么区别?如果您不解释问题所在,仅显示代码将无济于事。
  • 我已经用 apilist.txt 更新了 OP.. 实际上保存到列表工作正常.. 我不确定保存后如何处理列表.. 下一个之后是读取输出日志文件并查看 func_name 是否存在。如果存在,我必须将标志更新为 1.. 最后我必须创建一个报告,说明这些功能已执行,而这些没有..
  • 我必须对单个文件名下的所有标志值求和.. 我不知道该怎么做..
  • 那么对于您展示的示例 apiList.txt,您的预期输出是什么

标签: python database csv


【解决方案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

【讨论】:

    【解决方案2】:

    我会去字典。这将创建一个字典,测试 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}
    

    【讨论】:

    • 谢谢。这应该有效。我还有一个问题:如何通过 func_name 搜索来更新列表中的标志值?
    • 我不清楚你的意思;对于每个文件名,您希望它在每次计算 func_name 时跟踪?
    【解决方案3】:

    使用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
    >>>
    

    更改标志,其中第一列包含 file_name2,第二列包含 func_name1

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

    【讨论】:

    • 谢谢。这应该有效。我对此不确定:我需要在 data 中的 file_name2 中搜索 func_name1 并将标志值更新为 1。我该怎么做?
    • 有没有办法在不使用 pandas 的情况下搜索和更新列表?
    • 你可以查看@austin-hastings的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 2012-08-26
    • 2018-08-23
    • 1970-01-01
    相关资源
    最近更新 更多