Python 1-lined for循环

时间:2016-11-28 18:32:45

标签: python for-loop

我正在寻找一种方法来使这个循环“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循环可以解决问题,但我不知道该怎么做。

我不熟悉这种东西,所以我不知道它叫什么。因此,我无法对其进行任何研究或提出正确的标题。 请原谅我。

谢谢!

3 个答案:

答案 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循环。同样适用于ifelsewhiledef等。这通常不被视为一种好习惯,但在命令行上快速键入时可以很方便。

  • 实际上你可以使用另一种方法,但它可能比第二种方法更错误,它可以直接将循环重写为列表理解:

    [print(item["path"]) for item in base["paths"]]
    

    这将创建并放弃与None相同长度的base["paths"]元素列表,因为print返回None。这可能超过使用join的唯一可能优势是它不会创建完整的中间字符串进行打印。

<强> TL; DR

使用for循环。

答案 2 :(得分:0)

可以使用maplambda

完成
map( (lambda x: print(x["path"])), base["paths"])

这只适用于Python 3,因为在Python 2.x print中的语句不是函数(参见What’s New In Python 3.0