TypeError: lijstindices moeten gehele getallen of segmenten zijn, niet str

Ik heb twee lijsten die ik wil samenvoegen tot een enkele array en deze uiteindelijk in een csv-bestand wil plaatsen. Ik ben een newbie met Python-arrays en ik begrijp niet hoe ik deze fout kan vermijden:

def fill_csv(self, array_urls, array_dates, csv_file_path):
    result_array = []
    array_length = str(len(array_dates))
    # We fill the CSV file
    file = open(csv_file_path, "w")
    csv_file = csv.writer(file, delimiter=';', lineterminator='\n')
    # We merge the two arrays in one
    for i in array_length:
        result_array[i][0].append(array_urls[i])
        result_array[i][1].append(array_dates[i])
        i += 1
    csv_file.writerows(result_array)

En kreeg :

 File "C:\Users\--\gcscan.py", line 63, in fill_csv
    result_array[i][0].append(array_urls[i])
TypeError: list indices must be integers or slices, not str

Hoe kan mijn telling werken?


Antwoord 1, autoriteit 100%

Ten eerste moet array_lengtheen geheel getal zijn en geen tekenreeks:

array_length = len(array_dates)

Ten tweede moet uw for-lus worden geconstrueerd met behulp van range:

for i in range(array_length):  # Use `xrange` for python 2.

Ten derde, iwordt automatisch verhoogd, dus verwijder de volgende regel:

i += 1

Let op, je kunt de twee lijsten ook gewoon zipaangezien ze dezelfde lengte hebben:

import csv
dates = ['2020-01-01', '2020-01-02', '2020-01-03']
urls = ['www.abc.com', 'www.cnn.com', 'www.nbc.com']
csv_file_patch = '/path/to/filename.csv'
with open(csv_file_patch, 'w') as fout:
    csv_file = csv.writer(fout, delimiter=';', lineterminator='\n')
    result_array = zip(dates, urls)
    csv_file.writerows(result_array)

Antwoord 2, autoriteit 17%

Ik had dezelfde fout en de fout was dat ik lijst en woordenboek had toegevoegd aan dezelfde lijst (object) en wanneer ik de lijst met woordenboeken doorliep en gebruikte om een lijst (type) object te raken, deed ik dat altijd krijg deze fout.

Het was een codefout en zorgde ervoor dat ik alleen woordenboekobjecten aan die lijst toevoegde en getypte objecten in de lijst, dit loste ook mijn probleem op.


Antwoord 3, autoriteit 9%

Volg op Abdeali Chandanwala antwoordhierboven (kon niet reageren omdat rep<50) –

TL;DR: Ik probeerde een lijst met woordenboeken onjuist te doorlopen door me te concentreren om de sleutels in het woordenboek te herhalen, maar in plaats daarvan moest ik de woordenboeken zelf herhalen!


Ik kwam dezelfde fout tegen terwijl ik een structuur als deze had:

{
   "Data":[
      {
         "RoomCode":"10",
         "Name":"Rohit",
         "Email":"[email protected]"
      },
      {
         "RoomCode":"20"
         "Name":"Karan",
         "Email":"[email protected]"
      }
   ]
}

En ik probeerde de namen in een lijst als deze toe te voegen-

Opgelost door-


Antwoord 4

Ik kreeg deze fout bij het overbelasten van een functie in python waarbij de ene functie een andere omwikkelde:

def getsomething(build_datastruct_inputs : list[str]) -> int:
      # builds datastruct and calls getsomething
      return getsomething(buildit(build_datastruct_inputs))
def getsomething(datastruct : list[int]) -> int:
      # code
      # received this error on first use of 'datastruct'

Oplossing was om niet te overbelasten en een unieke methodenaam te gebruiken.

def getsomething_build(build_datastruct_inputs : list[str]) -> int:
      # builds datastruct and calls getsomething
      return getsomething_ds(buildit(build_datastruct_inputs))
def getsomething_ds(datastruct : list[int]) -> int:
      # code
      # works fine again regardless of whether invoked directly/indirectly

Een andere oplossing zou kunnen zijn om het python multipledispatch-pakket te gebruiken, waardoor u overbelast raakt en dit voor u uitzoekt.

Was een beetje verwarrend omdat waar de fout optrad (noch bericht) overeenkwam met de oorzaak. Ik dacht dat ik had gezien dat python native overbelasting ondersteunde, maar nu heb ik geleerd dat de implementatie meer werk van de gebruiker vereist.

Other episodes