【问题标题】:associative arrays awk vs python关联数组 awk 与 python
【发布时间】:2014-06-21 21:01:51
【问题描述】:

我在 awk 中使用关联数组来执行数据集中值的计算。我想知道如何在 Python 中执行完全相同的操作。

输入
键1;cr;10
Key1;db;5
Key2;cr;5
Key2;db;7
Key2;cr;9
Key2;cr;12
Key3;db;3

awk -F";" '{a[$1]+=$2=="cr"?$3:$3*-1}END{for(i in a){print i FS a[i]}}' input

输出
键 1;5
键 2;19
Key3;9

【问题讨论】:

  • 你能给出你的实际算法而不是一个不工作的 awk 命令吗?
  • python 专家可能不知道 awk,任何人都会被神秘的声明 a[$1]+=$2=="cr"?$3:$3*-1 弄糊涂。你不能添加一些括号来澄清(并使其可移植 - 正如所写的那样,代码会从某些 awk 产生语法错误)并解释 awk 代码在做什么?如果你这样做了,你将更有可能让 python 专家考虑帮助你。
  • awk 只是缺少一个右括号(并且仍然难以理解)。不过,基本上,它会添加 cr(贷方)值并从每个不同键的运行总计中减去 db(借方)值。
  • 如何让 Key3 和为 9?
  • 我的主要观点实际上只是用 X 语言发布一个没有任何解释的程序并询问如何用 Y 语言编写它是一个坏主意,因为它需要熟悉两种语言的人来回答当你真正需要得到一个语言 Y 的脚本时,你只需要知道语言 Y 的人。虽然复杂的三元表达式没有帮助!

标签: python awk associative-array


【解决方案1】:

Python 2:

data = '''Key1;cr;10
Key1;db;5
Key2;cr;5
Key2;db;7
Key2;cr;9
Key2;cr;12
Key3;db;3
'''

results = {}

for line in data.splitlines():

    fields = line.split(';')

    if fields[0] not in results:
        results[fields[0]] = 0

    if fields[1] == 'cr':
        results[fields[0]] += int(fields[2])
    else:
        results[fields[0]] -= int(fields[2])

#--- END ---

for key in sorted(results.keys()):
    print '%s;%s' % (key, results[key])

编辑:

顺便说一句:

a[$1]+=$2=="cr"?$3:$3*-1

可以在 Python 中完成(伪代码)

a[$1] += ( $3 if $2=="cr" else $3*-1 )

【讨论】:

    猜你喜欢
    • 2014-02-16
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 2011-09-06
    相关资源
    最近更新 更多