Python类型错误:';设置';对象不可下标

Python类型错误:';设置';对象不可下标,python,Python,当我对这个方法进行函数调用时,create({'1','2'})我在第行得到一个TypeError:'set'对象不可下标错误 'AWS':列表(映射(lambda id:f“arn:AWS:iam::{id}:root”,id[i:i+200])。 来自java背景,这与类型转换有什么关系吗? 这个错误是否意味着我正在将一个集合数据结构传递给一个列表函数? 如何解决这个问题?根据Python的官方文档,set数据结构被称为唯一元素的无序集合,不支持索引或切片等操作 与其他集合一样,集合支持集合

当我对这个方法进行函数调用时,
create({'1','2'})
我在第行得到一个
TypeError:'set'对象不可下标
错误
'AWS':列表(映射(lambda id:f“arn:AWS:iam::{id}:root”,id[i:i+200])
。 来自java背景,这与类型转换有什么关系吗?
这个错误是否意味着我正在将一个集合数据结构传递给一个列表函数?
如何解决这个问题?

根据Python的官方文档,
set
数据结构被称为
唯一元素的无序集合
,不支持索引或切片等操作

与其他集合一样,集合支持集合中的x、len(集合)和集合中的x。集合是无序集合,不记录元素位置或插入顺序。因此,集合不支持索引、切片或其他类似序列的行为

当您定义
temp_set={1,2,3}
时,它只意味着
temp_set
包含3个元素,但没有可以获得的索引

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
>>temp_set={1,2,3}
>>>1英寸温度设置
>>>真的
>>>温度设置[0]
>>>回溯(最近一次呼叫最后一次):
文件“/usr/local/lib/python3.7/site packages/IPython/core/interactiveshell.py”,第3326行,运行代码
exec(代码对象、self.user\u全局、self.user\n)
文件“”,第1行,在
温度设置[0]
TypeError:“set”对象不可下标

就像@Carcigenicate在评论中所说的那样,由于集合在Python中是无序的,因此无法对其进行索引。相反,您可以在
while
循环中使用
itertools.islice
,一次从给定集合创建的迭代器中获取200个项目:

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

在python中处理列表时,我遇到了同样的问题

在python中,列表是用方括号定义的,而不是花括号

错误列表{1,2,3}

权利清单[1,2,3]

此链接详细介绍了有关列表的更多信息

问题是
集合
无序,因此不支持索引和切片。为什么必须将
set
传递给此函数?您使用
ids[i:i+200]
的目的是什么?如错误所示,无法为集合编制索引。可以先将其放入列表中,或者使用
islice
?对集合进行索引很可能是因为集合没有排序,所以任何给定索引处的元素本质上都是任意的。“该错误是否意味着我正在将集合数据结构传递给列表函数?”类似于。只是python中没有“列表函数”这样的东西。Python是一种动态类型的语言,但您正在将一个
set
对象传递给一个函数,该函数将尝试为该对象编制索引,而set对象不支持该函数。我无法控制输入。设置它们是为了避免重复。在创建新的sns语句时,我需要ID[I:I+200]将输入分解成块。诀窍是将集合转换为列表([*set,]),然后迭代。谢谢。成功了。我想到的另一个解决方案是使用[*id]将传入的集合转换成列表,然后继续。同样适用于NLTK例程:从itertools导入islice bestwords=set([w代表w,s代表最佳值])打印(列表(islice(bestwords,10)))
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