【问题标题】:How to translate this code into python 3?如何将此代码翻译成python 3?
【发布时间】:2023-11-17 03:59:01
【问题描述】:

这段代码最初是用 Python 2 编写的,我需要在 python 3 中翻译它! 很抱歉没有分享足够的信息: 另外,这里是首次分配self.D 的部分:

    def __init__(self,instance,transformed,describe1,describe2):
        self.D=[]
        self.instance=instance
        self.transformed=transformed
        self.describe1,self.describe2=describe1,describe2
        self.describe=self.describe1+', '+self.describe2 if self.describe2 else self.describe1
        self.column_num=self.tuple_num=self.view_num=0
        self.names=[]
        self.types=[]
        self.origins=[]
        self.features=[]
        self.views=[]
        self.classify_id=-1
        self.classify_num = 1
        self.classes=[]


    def generateViews(self):
        T=map(list,zip(*self.D))
        if self.transformed==0:
            s= int( self.column_num)
            for column_id in range(s):
                f = Features(self.names[column_id],self.types[column_id],self.origins[column_id])

            #calculate min,max for numerical,temporal
                if f.type==Type.numerical or f.type==Type.temporal:
                   f.min,f.max=min(T[column_id]),max(T[column_id])
                   if f.min==f.max:
                      self.types[column_id]=f.type=Type.none
                      self.features.append(f)
                      continue

                d={}
            #calculate distinct,ratio for categorical,temporal
                if f.type == Type.categorical or f.type == Type.temporal:
                   for i in range(self.tuple_num):
                       print([type(self.D[i]) for i in range(self.tuple_num)])
                       if self.D[i][column_id] in d:                           
                          d[self.D[i][column_id]]+=1
                       else:
                          d[self.D[i][column_id]]=1
                    f.distinct = len(d)
                    f.ratio = 1.0 * f.distinct / self.tuple_num
                    f.distinct_values=[(k,d[k]) for k in sorted(d)]
                    if f.type==Type.temporal:
                       self.getIntervalBins(f)

                   self.features.append(f)

TypeError: 'map' 对象不可下标

【问题讨论】:

    标签: python-3.7


    【解决方案1】:

    你给的sn-p不足以解决问题。问题在于您尝试使用self.D[i] 为其下标的self.D。请查看self.D 被实例化的代码,并确保它是一个类似数组的变量,以便您可以对其进行下标。

    编辑

    根据您的编辑,请确认self.D[i] 对于代码中提到的范围内的所有i 是否也类似于数组。你可以简单地做到这一点

    print([type(self.D[i]) for i in range(self.tuple_num))
    

    分享此代码的响应,以便我可以进一步提供帮助。

    编辑-2

    根据您的 cmets 和编辑后的代码 sn-p,似乎 self.D 是某些 map 函数的输出。在 python 2 中,map 是一个返回列表的函数。但是,在 python3 中,map 是一个在调用时会创建一个地图对象的类。

    解决此问题的最简单方法是找出第一次分配self.D 的行,以及RHS 中的任何代码,用list(...) 函数包装它。

    或者,就在这一行之后

    T=map(list,zip(*self.D))
    

    添加以下内容

    self.D = list(self.D)
    

    希望这能解决问题

    【讨论】:

    • TypeError: 'map' 对象不可下标。这是否意味着self.D 是一个地图对象?
    • 在这种情况下,self.D 绝对不是您声称的列表。检查isinstance(self.D, list) 或简单地输入type(self.D) 来检查它是什么类型的变量
    • 打印False
    • 这意味着你的 self.D 不是一个列表。我敢打赌,它是一个地图对象。我需要你的更多代码才能完全调试它。
    • 我已经编辑了我的问题,希望我现在提供了足够的信息!
    【解决方案2】:

    我们没有足够的信息来回答这个问题,但是在 Python 3 中,生成器和地图对象是不可下标的。我想它可能在你的

    self.D[i]
    

    变量,因为您声称self.D 是一个列表,但self.D[i] 可能是一个地图对象。

    在您的情况下,要访问索引,您可以将其转换为列表:

    list(self.D)[i]
    

    或者使用解包隐式转换为列表(这可能更简洁,但请记住显式优于隐式):

    [*self.D[i]]
    

    【讨论】:

    • 是的,它是一个地图对象。我错了
    最近更新 更多