簡體   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