我正在寻找一种方法来使这个循环“1衬里” 像这样:
print([k for k in ["hello", "hi", "bye"]])
这是for循环:
for idx, item in enumerate(base["paths"]):
print(base["paths"][idx]["path"])
基本上,我有一个带有文件夹/文件路径,类型和md5校验和列表的JSON sting。 它看起来像这样:
{
"paths": [
{
"md5": "None",
"path": "shared/",
"type": "folder"
},
{
"md5": "01d5c39c19f6b334145315672cf70f6b",
"path": "shared/memes.txt",
"type": "file"
},
{
"md5": "2c04a7ccefc2596b726646f30b557921",
"path": "shared/plan.txt",
"type": "file"
},
{
"md5": "None",
"path": "shared/downloads",
"type": "folder"
},
{
"md5": "None",
"path": "shared/downloads/linux",
"type": "folder"
},
{
"md5": "d41d8cd98f00b204e9800998ecf8427e",
"path": "shared/downloads/linux/setup.txt",
"type": "file"
},
{
"md5": "None",
"path": "shared/downloads/linux/boot",
"type": "folder"
},
{
"md5": "b36694d5b1ab1b2e96f197f62bb76459",
"path": "shared/downloads/linux/boot/boot.txt",
"type": "file"
},
{
"md5": "None",
"path": "shared/downloads/steam",
"type": "folder"
},
{
"md5": "d41d8cd98f00b204e9800998ecf8427e",
"path": "shared/downloads/steam/csgo.txt",
"type": "file"
},
{
"md5": "None",
"path": "shared/games",
"type": "folder"
},
{
"md5": "None",
"path": "shared/games/pixel",
"type": "folder"
},
{
"md5": "d41d8cd98f00b204e9800998ecf8427e",
"path": "shared/games/pixel/pixel.txt",
"type": "file"
},
{
"md5": "None",
"path": "shared/games/pixel/data",
"type": "folder"
},
{
"md5": "d41d8cd98f00b204e9800998ecf8427e",
"path": "shared/games/pixel/data/lib.txt",
"type": "file"
},
{
"md5": "None",
"path": "shared/music",
"type": "folder"
},
{
"md5": "d41d8cd98f00b204e9800998ecf8427e",
"path": "shared/music/some other new awesome music.txt",
"type": "file"
},
{
"md5": "None",
"path": "shared/New folder",
"type": "folder"
}
]
}
我想要做的是列出所有“路径”,我想,使用1行for循环可以解决问题,但我不知道该怎么做。
我不熟悉这种东西,所以我不知道它叫什么。因此,我无法对其进行任何研究或提出正确的标题。 请原谅我。
谢谢!
答案 0 :(得分:2)
没有理由不能做同样的列表理解技巧。 为:
for k in ["hello", "hi", "bye"]]):
print(k)
是
[ k for k in ["hello", "hi", "bye"] ]
,所以
for idx, item in enumerate(base["paths"]):
print(base["paths"][idx]["path"])
是
[ base["paths"][idx]["path"] for idx, item in enumerate(base["paths"]) ]
...虽然我应该指出,您正在浪费您目前未使用的item
变量提供的经济和清晰度的潜力。如果您利用它,那么在您的(简化?)示例中,idx
将变为未使用,这意味着您完全摆脱了enumerate
:
for item in base["paths"]:
print(item["path"])
类似地:
[ item["path"] for item in base["paths"] ]
[显然,用结果列表做任何你想做的事情。将其分配给变量,将其直接传递到print()
(如您的问题中),等等。]
答案 1 :(得分:0)
@ jez的答案将涵盖如何简化循环到理解的大多数情况。但是,直接将print
直接粘贴到循环中的问题是它返回None
。您可以使用几种解决方案。
最好的方法是将循环粘贴到print语句中而不是相反,正如@AChampion在第一条评论中建议的那样:
print('\n'.join(item["path"] for item in base["paths"]))
str.join
将使用作为分隔符调用的字符串连接可迭代字符串的所有元素。在这种情况下,它说“在base["paths"]
的每个元素之间添加换行符并打印结果。
最简单的方法是作弊:
for item in base["paths"]: print(item["path"])
您可以在一行上放置单个语句for
循环。同样适用于if
,else
,while
,def
等。这通常不被视为一种好习惯,但在命令行上快速键入时可以很方便。
实际上你可以使用另一种方法,但它可能比第二种方法更错误,它可以直接将循环重写为列表理解:
[print(item["path"]) for item in base["paths"]]
这将创建并放弃与None
相同长度的base["paths"]
元素列表,因为print
返回None
。这可能超过使用join
的唯一可能优势是它不会创建完整的中间字符串进行打印。
<强> TL; DR 强>
使用for
循环。
答案 2 :(得分:0)
可以使用map
和lambda
:
map( (lambda x: print(x["path"])), base["paths"])
这只适用于Python 3,因为在Python 2.x print
中的语句不是函数(参见What’s New In Python 3.0)