首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“in”对象在lambda python中不可订阅

“in”对象在lambda python中不可订阅
EN

Stack Overflow用户
提问于 2018-04-02 04:50:32
回答 4查看 5K关注 0票数 1

我已经创建了一个dict列表,我想根据dict中的一个元素(句点)进行排序。

代码语言:javascript
复制
T=dict()
def TaskGenerator(N):
    for i in range (0,N):
        ExcTime=randint(1,20)
        Period=randint(1,20)+ExcTime
        Uterlization=ExcTime/Period
        T[i]={'ID':i+1 , 'ExcTime' : ExcTime, 'Period' : Period, 'Uterlization':Uterlization}
    sorted(T,key=lambda x:x['Period'])
TaskGenerator(6)

但是,它给了我一个错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "C:\Users\wei.du\Desktop\real-time\RMLS.py", line 33, in <module>
    TaskGenerator(6)
  File "C:\Users\wei.du\Desktop\real-time\RMLS.py", line 17, in TaskGenerator
sorted(T,key=lambda x:x['Period'])
  File "C:\Users\wei.du\Desktop\real-time\RMLS.py", line 17, in <lambda>
sorted(T,key=lambda x:x['Period'])
TypeError: 'int' object is not subscriptable

我认为,在“排序”函数中,在lambda函数中,"x“是一个整数。但我真的不明白,"x“不是Ti的瞬间。为什么它抱怨"x“是一个整数?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-04-02 05:12:41

当您尝试对dict进行排序时,您得到的是密钥。由于您的键都是整数,因此sorted试图按照您提供的key给出正确的顺序。但是,您想要的是按排序顺序排列的dict元素。要获得元素,可以使用T.values()

使用这些值,TaskGenerator()函数将类似于

代码语言:javascript
复制
from random import randint

T=dict()
def TaskGenerator(N):
    for i in range (0,N):
        ExcTime=randint(1,20)
        Period=randint(1,20)+ExcTime
        Uterlization=ExcTime/Period
        T[i]={'ID':i+1 , 'ExcTime' : ExcTime, 'Period' : Period, 'Uterlization':Uterlization}
    return sorted(T.values(), key=lambda x:x['Period'])
TaskGenerator(6)

请注意,T.values()生成一个新的项列表,您必须return该列表才能在函数之外引用该列表。

票数 0
EN

Stack Overflow用户

发布于 2018-04-02 05:07:52

dict上的迭代是在键上进行的,键是int,它是不可订阅的(int上没有['Period'] )。

另外,您没有分配sorted的结果。试一试:

代码语言:javascript
复制
sorted_values = sorted(T.values(), key=lambda x:x['Period'])
票数 2
EN

Stack Overflow用户

发布于 2018-04-02 05:01:32

你在试着对字典排序,这是不可能的。你能做的就是用列表代替。

代码语言:javascript
复制
def TaskGenerator(N):
    T=[]
    for i in range (0,N):
        ExcTime=randint(1,20)
        Period=randint(1,20)+ExcTime
        Uterlization=ExcTime/Period
        T.append({'ID':i+1 , 'ExcTime' : ExcTime, 'Period' : Period, 'Uterlization':Uterlization})
    print(T)
    T = sorted(T,key=lambda x:x['Period'])
    print(T)

TaskGenerator(6)

样本输出:

代码语言:javascript
复制
[{'ID': 1, 'ExcTime': 17, 'Period': 35, 'Uterlization': 0.4857142857142857}, {'ID': 2, 'ExcTime': 9, 'Period': 29, 'Uterlization': 0.3103448275862069}, {'ID': 3, 'ExcTime': 1, 'Period': 8, 'Uterlization': 0.125}, {'ID': 4, 'ExcTime': 14, 'Period': 18, 'Uterlization': 0.7777777777777778}, {'ID': 5, 'ExcTime': 1, 'Period': 10, 'Uterlization': 0.1}, {'ID': 6, 'ExcTime': 7, 'Period': 8, 'Uterlization': 0.875}]
[{'ID': 3, 'ExcTime': 1, 'Period': 8, 'Uterlization': 0.125}, {'ID': 6, 'ExcTime': 7, 'Period': 8, 'Uterlization': 0.875}, {'ID': 5, 'ExcTime': 1, 'Period': 10, 'Uterlization': 0.1}, {'ID': 4, 'ExcTime': 14, 'Period': 18, 'Uterlization': 0.7777777777777778}, {'ID': 2, 'ExcTime': 9, 'Period': 29, 'Uterlization': 0.3103448275862069}, {'ID': 1, 'ExcTime': 17, 'Period': 35, 'Uterlization': 0.4857142857142857}]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49605457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档