繁体   English   中英

python append 在for循环中列出

[英]python append to list in a for loop

下面你可以看到一段简化的代码,但我遇到的问题是清晰可见的。 我有一个充满数据的字典。 它来自一个 get 请求。 所以我不能改变结构。 我想在列表中添加 print(test(data,x)) 的 output 但列表包含其他数据。 当我查看这个问题时,我发现我必须使用.copy()/list(),但我找不到让它工作的方法。

新代码(经过一些可能的改进)

data = {"datasource": "InfluxDB", "gridPos": {"h": 4, "w": 3, "x": 3, "y": 14}, "id": 80, "targets": [{"measurement": "database"}, {"measurement": "database"}],"title": "Name"}
test_list = []

def test(data,database):
    data = data.copy()
    data['gridPos']['x'] += data['gridPos']['w'] + 1
    data['gridPos']['y'] += data['gridPos']['h'] + 1
    data['id'] += 1
    data['targets'][0]['measurement'] += str(database) 
    return data

for x in range(0,10):
    data = test(data,x)
    test_list.append(data.copy())

test_list
data = {"datasource": "InfluxDB", "gridPos": {"h": 4, "w": 3, "x": 3, "y": 14}, "id": 80, "targets": [{"measurement": "database"}, {"measurement": "database"}],"title": "Naam"}
test_list = []

def test(data,database):
    data['gridPos']['x'] += data['gridPos']['w'] + 1
    data['gridPos']['y'] += data['gridPos']['h'] + 1
    data['id'] += 1
    data['targets'][0]['measurement'] += str(database) 
    return data

for x in range(0,10):
    print(test(data,x))
    test_list.append(test(data,x).copy())

print(test_list)

print(test(data,x)) (在 for 循环中)

{'datasource': 'InfluxDB', 'gridPos': {'h': 4, 'w': 3, 'x': 7, 'y': 19}, 'id': 81, 'targets': [{'measurement': 'database0'}, {'measurement': 'database'}], 'title': 'Name'}
{'datasource': 'InfluxDB', 'gridPos': {'h': 4, 'w': 3, 'x': 15, 'y': 29}, 'id': 83, 'targets': [{'measurement': 'database001'}, {'measurement': 'database'}], 'title': 'Name'}
{'datasource': 'InfluxDB', 'gridPos': {'h': 4, 'w': 3, 'x': 23, 'y': 39}, 'id': 85, 'targets': [{'measurement': 'database00112'}, {'measurement': 'database'}], 'title': 'Name'}
{'datasource': 'InfluxDB', 'gridPos': {'h': 4, 'w': 3, 'x': 31, 'y': 49}, 'id': 87, 'targets': [{'measurement': 'database0011223'}, {'measurement': 'database'}], 'title': 'Name'}
{'datasource': 'InfluxDB', 'gridPos': {'h': 4, 'w': 3, 'x': 39, 'y': 59}, 'id': 89, 'targets': [{'measurement': 'database001122334'}, {'measurement': 'database'}], 'title': 'Name'}
{'datasource': 'InfluxDB', 'gridPos': {'h': 4, 'w': 3, 'x': 47, 'y': 69}, 'id': 91, 'targets': [{'measurement': 'database00112233445'}, {'measurement': 'database'}], 'title': 'Name'}
{'datasource': 'InfluxDB', 'gridPos': {'h': 4, 'w': 3, 'x': 55, 'y': 79}, 'id': 93, 'targets': [{'measurement': 'database0011223344556'}, {'measurement': 'database'}], 'title': 'Name'}
{'datasource': 'InfluxDB', 'gridPos': {'h': 4, 'w': 3, 'x': 63, 'y': 89}, 'id': 95, 'targets': [{'measurement': 'database001122334455667'}, {'measurement': 'database'}], 'title': 'Name'}
{'datasource': 'InfluxDB', 'gridPos': {'h': 4, 'w': 3, 'x': 71, 'y': 99}, 'id': 97, 'targets': [{'measurement': 'database00112233445566778'}, {'measurement': 'database'}], 'title': 'Name'}
{'datasource': 'InfluxDB', 'gridPos': {'h': 4, 'w': 3, 'x': 79, 'y': 109}, 'id': 99, 'targets': [{'measurement': 'database0011223344556677889'}, {'measurement': 'database'}], 'title': 'Name'}

打印(测试列表)

[{'datasource': 'InfluxDB',
  'gridPos': {'h': 4, 'w': 3, 'x': 83, 'y': 114},
  'id': 82,
  'targets': [{'measurement': 'database00112233445566778899'},
   {'measurement': 'database'}],
  'title': 'Name'},
 {'datasource': 'InfluxDB',
  'gridPos': {'h': 4, 'w': 3, 'x': 83, 'y': 114},
  'id': 84,
  'targets': [{'measurement': 'database00112233445566778899'},
   {'measurement': 'database'}],
  'title': 'Name'},
 {'datasource': 'InfluxDB',
  'gridPos': {'h': 4, 'w': 3, 'x': 83, 'y': 114},
  'id': 86,
  'targets': [{'measurement': 'database00112233445566778899'},
   {'measurement': 'database'}],
  'title': 'Name'},
 {'datasource': 'InfluxDB',
  'gridPos': {'h': 4, 'w': 3, 'x': 83, 'y': 114},
  'id': 88,
  'targets': [{'measurement': 'database00112233445566778899'},
   {'measurement': 'database'}],
  'title': 'Name'},
 {'datasource': 'InfluxDB',
  'gridPos': {'h': 4, 'w': 3, 'x': 83, 'y': 114},
  'id': 90,
  'targets': [{'measurement': 'database00112233445566778899'},
   {'measurement': 'database'}],
  'title': 'Name'},
 {'datasource': 'InfluxDB',
  'gridPos': {'h': 4, 'w': 3, 'x': 83, 'y': 114},
  'id': 92,
  'targets': [{'measurement': 'database00112233445566778899'},
   {'measurement': 'database'}],
  'title': 'Name'},
 {'datasource': 'InfluxDB',
  'gridPos': {'h': 4, 'w': 3, 'x': 83, 'y': 114},
  'id': 94,
  'targets': [{'measurement': 'database00112233445566778899'},
   {'measurement': 'database'}],
  'title': 'Name'},
 {'datasource': 'InfluxDB',
  'gridPos': {'h': 4, 'w': 3, 'x': 83, 'y': 114},
  'id': 96,
  'targets': [{'measurement': 'database00112233445566778899'},
   {'measurement': 'database'}],
  'title': 'Name'},
 {'datasource': 'InfluxDB',
  'gridPos': {'h': 4, 'w': 3, 'x': 83, 'y': 114},
  'id': 98,
  'targets': [{'measurement': 'database00112233445566778899'},
   {'measurement': 'database'}],
  'title': 'Name'},
 {'datasource': 'InfluxDB',
  'gridPos': {'h': 4, 'w': 3, 'x': 83, 'y': 114},
  'id': 100,
  'targets': [{'measurement': 'database00112233445566778899'},
   {'measurement': 'database'}],
  'title': 'Name'}]

您的test function 转换data ,您调用它两次 - 一次打印,一次调用 append,因此它在每次迭代中转换字典两次。 此外, copy只制作字典的浅拷贝,但您需要深拷贝,因为它包含嵌套的字典和列表。

要解决此问题, import copy并更改此行

test_list.append(test(data,x).copy())

test_list.append(copy.deepcopy(data)) # data has already been transformed so no need to call `test` again

或者更好的是,更改结构,使您的 function 没有副作用:

def test(data,database):
    data = copy.deepcopy(data)
    data['gridPos']['x'] += data['gridPos']['w'] + 1
    data['gridPos']['y'] += data['gridPos']['h'] + 1
    data['id'] += 1
    data['targets'][0]['measurement'] += str(database) 
    return data

for x in range(10):
    data = test(data,x)
    print(data)
    test_list.append(data)

一般来说,对于 function 来说,避免转换其参数而是返回一个新值会更干净。 如果您确实需要 function 来就地转换 object,那么可能还要避免返回相同的 object,因为这可能会导致混淆。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM