【问题标题】:How can I ignore a Specific Index? Python如何忽略特定索引? Python
【发布时间】:2021-09-17 04:30:22
【问题描述】:

我正在尝试解析 JSON 输出,如果索引的 userId 为 5,我想忽略它。问题是它仍然没有忽略它。

这是我阅读 json 的方式(工作):

import json
import urllib.request

url = "https://jsonplaceholder.typicode.com/posts"
data = urllib.request.urlopen(url).read().decode()

site_info =json.loads(data)

for info in site_info:
  print(f"{}, {}, {}, {}".format(info["userId"], info["id"],
                                 info["title"], info["body"]))

这是我准备要检查的用户 ID 列表的方法(删除 5 个不起作用):

mylist= [{"userId":1}, {"userId":2}, {"userId":3}, {"userId":4}, {"userId":5}, 
         {"userId":6}, {"userId":7}, {"userId":8}, {"userId":9}, {"userId":10}]

for i in range(len(mylist)-5, -5, -5):
    print(i)
    if mylist[i]["userId"] == 5:
        mylist.pop(i)

print (mylist)

我还需要在作业中使用.pop

【问题讨论】:

    标签: python list loops


    【解决方案1】:

    您的代码完全按照您的指示行事:

    • 它会检查您的mylist n 上的位置 5 和 0
    • 如果有一个 mylist[i]["userId"] == 5 会做某事
    • mylist[i]["userId"] == 5 也没有,所以它什么也不做。

    除此之外:NEVER change a list while iterating(除非您知道如何操作 - 您没有正确操作)。

    您可以记住要单独弹出和弹出的索引:

    idx_to_delete = []
    
    for idx,value in enumerate(mylist):
        if value["userId"] == 5:
            idx_to_delete.append(idx)
    
    # reverse - because if you pop 2 and then 5 the popping of 2
    # would lead to 5 now being 4 etc. if you pop the higher ones 
    # first you do not have that problem.
    # reversed(idx_to_delete) == idx_to_delete[::-1]
    for id in reversed(idx_to_delete):
        mylist.pop(id)
    

    要提高问题的质量,您应该

    1. 删除所有 JSON 内容 - 您永远不会将 site_info 用于您的实际问题,因此它不属于最小可重现示例
    2. 摆脱让你感到困惑的事情:range(len(mylist)-5, -5, -5) 计算结果为range(10-5, -5, -5),如果迭代,结果为5,0 - 所以用for i in (5,0): 替换它。如果您检查mylist[5]mylist[0],您会发现两者都没有["userId"] == 5

    您的问题代码可以归结为

    mylist= [{"userId":1},{"userId":2},{"userId":3},{"userId":4},{"userId":5}, 
             {"userId":6},{"userId":7},{"userId":8},{"userId":9},{"userId":10}]
    
    for i in (5,0):
        print(i)
        if mylist[i]["userId"] == 5:
            mylist.pop(i)
    
    print (mylist)
    

    为什么“userId”== 5 没有弹出?列表没有变化?

    如果你这样做可能会更容易

    id_to_ignore = {5,}
    
    mylist = [{"userId":id} for id in range(10) if id not in id_to_ignore]
    
    # or as loop
    # mylist = []
    # for id in range(1,11):
    #    if id in id_to_ignore: 
    #        continue
    #    mylist.append( {"userId":id})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-11
      • 2020-12-08
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 2012-08-12
      • 2021-04-26
      • 2020-11-17
      相关资源
      最近更新 更多