Python TypeError: obiectul ‘set’ nu este subscriptibil (Programare, Python)

user2118245 a intrebat.
def create(ids):
    policy = {
        'Statement': []
    }
    for i in range(0, len(ids), 200):
        policy['Statement'].append({
            'Principal': {
                'AWS': list(map(lambda id: f"arn:aws:iam::{id}:root", ids[i:i + 200]))
            }
        })
    return policy

când fac un apel de funcție la această metodă create({'1','2'}) Primesc un TypeError: 'set' object is not subscriptable eroare la linia 'AWS': list(map(lambda id: f"arn:aws:iam::{id}:root", ids[i:i + 200])). Având în vedere că vin din mediul java, este cumva legat de typecasting? Oare eroarea înseamnă că transmit o structură de date de tip set către o funcție de tip listă?Cum se poate rezolva acest lucru?

Comentarii

  • Problema este următoarea sets nu sunt ordonate, prin urmare nu suportă indexarea și felierea. De ce trebuie să treceți o set la această funcție? –  > Por Selcuk.
  • Care este intenția dvs. cu ids[i:i + 200]? Seturile nu pot fi indexate, așa cum spune eroarea. Poate puneți mai întâi într-o listă sau folosiți islice? Indexarea unui set este permisă probabil pentru că seturile nu sunt ordonate, astfel încât elementul de la orice index dat este în esență arbitrar. –  > Por Carcigenicate.
  • „Eroarea înseamnă că trec o structură de date de set la o funcție de listă? ” Într-un fel. Doar că nu există o „funcție listă” în python. Python este un limbaj tipizat dinamic, dar dumneavoastră treceți o set obiect la o funcție care va încerca să indexeze acel obiect, ceea ce obiectele set nu suportă…  > Por juanpa.arrivillaga.
  • nu am control asupra intrărilor. Acestea sunt seturi pentru a evita dublurile. Aveam nevoie de ids[i:i+200] pentru a împărți intrările în bucăți în timp ce creez noi instrucțiuni sns. Trucul a fost să convertesc setul în listă ([*set, ]) și apoi să iteratez. –  > Por user2118245.
3 răspunsuri
CHINTAN VADGAMA

Conform documentației oficiale a lui Python, set structura de date este menționată ca Unordered Collections of Unique Elements și care nu acceptă operații precum indexarea sau felierea etc.

Ca și alte colecții, seturile acceptă x în set, len(set) și for x în set. Fiind o colecție neordonată, seturile nu înregistrează poziția elementelor sau ordinea de inserție. În consecință, seturile nu acceptă indexarea, împărțirea sau alte comportamente de tip secvență.

Atunci când definiți temp_set = {1, 2, 3} aceasta implică doar faptul că temp_set conține 3 elemente, dar nu există un index care să poată fi obținut

>>> temp_set = {1,2,3}
>>> 1 in temp_set
>>> True
>>> temp_set[0]
>>> Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/IPython/core/interactiveshell.py", line 3326, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-10-50885e8b29cf>", line 1, in <module>
    temp_set[0]
TypeError: 'set' object is not subscriptable

blhsing

Așa cum spune @Carcigenicate în comentariu, seturile nu pot fi indexate din cauza naturii sale neordonate în Python. În schimb, puteți utiliza itertools.islice în cadrul unui while buclă pentru a obține 200 de elemente la un moment dat din iteratorul creat din setul dat:

from itertools import islice

def create(ids):
    policy = {
        'Statement': []
    }
    i = iter(ids)
    while True:
        chunk = list(islice(i, 200))
        if not chunk:
            break
        policy['Statement'].append({
            'Principal': {
                'AWS': list(map(lambda id: f"arn:aws:iam::{id}:root", chunk))
            }
        })
    return policy

Comentarii

  • Vă mulțumim. Asta a funcționat. o altă soluție la care m-am gândit a fost să convertesc pur și simplu setul de intrare în listă folosind [*ids, ] și apoi să continui mai departe. –  > Por user2118245.
  • usefule și pentru rutinele NLTK: from itertools import islice bestwords = set([w for w, s in best]) print(list(islice(bestwords, 10))) – –  > Por Max Kleiner.
caroline mwasigala

M-am confruntat cu aceeași problemă atunci când am avut de-a face cu lista în python

În python lista este definită cu paranteze pătrate și nu cu paranteze drepte

greșit Lista {1,2,3}

Lista corectă [1,2,3]

Acest link oferă mai multe detalii despre listehttps://www.w3schools.com/python/python_lists.asp

Tags: