1-liner for python循环

时间:2016-11-27 13:26:46

标签: python for-loop

我有这个1-liner:

python -c 'import json,sys;obj=json.load(sys.stdin);print json.dumps(obj.get("dependencies"), indent=0, sort_keys=True)' < package.json

我想找到一个很好的简短解决方案,而不是重复自己,在["dependencies", "devDependencies", "peerDependencies"]上进行打印循环。

我现在所拥有的琐碎但不太好的解决方案:

python -c 'import json,sys;obj=json.load(sys.stdin);print json.dumps(obj.get("dependencies"), indent=0, sort_keys=True);print json.dumps(obj.get("devDependencies"), indent=0, sort_keys=True);print json.dumps(obj.get("peerDependencies"), indent=0, sort_keys=True)' < package.json

我也尝试过类似的事情:

python -c 'import json,sys;obj=json.load(sys.stdin);[print json.dumps(obj.get(dep), indent=0, sort_keys=True) for dep in "dependencies","devDependencies","peerDependencies"]' < package.json

更新:

我的目标是获得所有具有&#34; git&#34;在他们的网址中:

输入:package.json:

{
  "foo": "bar",
  "dependencies": {
    "a": "git:aa",
    "b": "git:bb",
    "c": "cc"
  },
  "peerDependencies": {
    "p": "git:pp"
  },
  "devDependencies": {
    "d": "git:dd"
  },
  "moo": "poo"
}

预期产出:

{
"a": "git:aa",
"b": "git:bb",
"c": "cc"
} {
"p": "git:pp"
} {
"d": "git:dd"
}

事实上,我并不太关心&#34;}&#34; -s和&#34; {&#34; -s,因为我将继续1-liner用:| grep 'git:'

2 个答案:

答案 0 :(得分:2)

您正在寻找join

import json,sys
obj=json.load(sys.stdin)
print ' '.join(json.dumps(obj.get(dep), indent=0, sort_keys=True) for dep in ("dependencies", "devDependencies", "peerDependencies"))

答案 1 :(得分:2)

这不是一个单行,只是你让你的生活更艰难。你的1-liner可以简单如下:

python my-script.py

在文本文件中有一个很好的格式化代码,不会违背整个语言的精神:https://www.python.org/dev/peps/pep-0008/

现在关于你的问题:

import json, sys

deps = ["dependencies", "peerDependencies", "devDependencies"]
data = json.loads(sys.stdin)

for dep in deps:
    if data[dep].startswith("git:"):
        print data[dep]

我认为应该这样做,然后你不需要| grep输出。 请注意,这是过滤依赖于START git:的依赖项,而不是那些按照您的要求包含它的依赖项,因为我发现这就是您想要的。否则,您可以将if data[dep].startswith("git:")替换为if "git:" in data[dep],这样就可以了。