cari

Rumah  >  Soal Jawab  >  teks badan

python怎样以带下标的list作为函数参数?

S0=['S1','S2','S3']
P=[]
def du(S0,P):
    for i in range(len(S0)):
        def d(S0[i]):
            d=0
            for n in range(len(P)):
                if S0[i] in P[n]:
                    d=d+1
            return d
        if d(S0[i])==0:
        ......

这里我想以 S0[i] 作为 d() 的参数,请问怎样可以实现以带下标的 list 作为函数参数? 或者有什么可以替代的方法?。

这个 d() 函数是要对 S0 中的每个元素进行分析的,我是想做一个简单的多边形拓扑关系的程序,要计算每条边(也就是 S0[i] )的度,当度大于 2 时把这条边从 S0 里删掉。

这里用 range 而不是直接 for i in list 是因为在另一个list中还要用到相同的下标位置,然后 P 也用 range 是因为 P 里边还有 list。

好像按@yooz_hardy所说的用 enumerate 可以解决我的问题了,还有什么更好的方法或者优化建议欢迎指出。

现在下标的问题已经弄清楚了,但是有关我这个多边形拓扑关系建立的作业又有了别的问题:

A=['S3','S2','S1']
B=['S4','S6','S1']
C=['S2','S5','S4']
D=['S3','S6','S5']
N=[A,B,C,D]            #节点表,每个点记录顺时针方向排序的弧段
N0=['A','B','C','D']   #节点的字符表
S1=['A','B']
S2=['C','A']
S3=['D','A']
S4=['B','C']
S5=['C','D']
S6=['B','D']
S=[S1,S2,S3,S4,S5,S6]                  #弧段表,每个弧段含有起始点和终点
S0=['S1','S2','S3','S4','S5','S6']     #弧段的字符表
P=[]


def du(Si,P):                  #定义弧段的‘度’,弧段属于一个多边形度就加一
    d=0
    for Pi in P:
        if Si in Pi:
            d=d+1
    return d

for i,Si in enumerate(S0):
    for j,Nj in enumerate(N0):
        if du(Si,P)==1:           #如果某弧段度等于1,将其从弧段表中删去
            S0.remove(Si)
            S.remove(S[i])
        elif du(Si,P)==2:         #如果某弧段度等于2,将其从节点的弧段排序中删去
            N[j].remove(Si)
        else:
            Pc=[Si]               #建立当前多边形
            Sc=Si                 #当前边
            Ns=S[i][0]            #起点
            Nc=S[i][1]            #当前点
            while Ns != Nc:
                k=N0.index(Nc)
                p=N[k].index(Sc)      #寻找当前点字符对应的节点,并在结点表中找到当前边位置
                p1=p+1                #当前边在表中下一条边的位置
                if p1 > len(N[k]):
                    i_p1=0
                Sc=N[k][p1]             #把下一条边设为当前边
                Pc.append(Sc)           #把新的当前边加入多边形中
                n=S0.index(Sc)
                Nc=S[n][1]              #新当前点
            P.append(Pc)                #起点终点重合时将当前多边形放入多边形组中
            

问题:
1.忽略了左多边形和右多边形,左多边形的新当前点为S[n][1],右多边形新当前点为S[n][0],这个可以先做个if看原本的当前点在新的当前弧中的位置,再确定是左还是右
2.但是多边形组'P'的结构不知道怎么设置比较好,如果在每个多边形里再分L,R两个分组会不会太复杂(起始边可以默认放在左多边形里)
3.节点表和弧段表每个都有对应的字符表,下边运算的时候还要找相应位置进行处理,挺麻烦,有没有什么函数直接把list的子集名变为字符?或者有什么更好的结构?

PHP中文网PHP中文网2830 hari yang lalu622

membalas semua(5)saya akan balas

  • 阿神

    阿神2017-04-17 17:50:57

    Berdasarkan maklumat semasa, berikut mungkin kaedah penulisan yang boleh anda rujuk:

    def d(s_item, P):
        d = 0
        for p_item in P:
            if s_item in p_item:
                d = d + 1
        return d
    
    S0=['S1','S2','S3']
    P=[]
    
    # 處理 S0 中的每一個元素
    for s_item in S0:
        if d(s_item, P)==0:
            # do something...
        elif d(s_item, P)==...
            # do something...
        #...

    Beberapa orang lain telah memberikan banyak cadangan berguna Satu lagi cadangan yang saya ada ialah cuba memberikan nama yang bermakna apabila menamakan pembolehubah, supaya orang yang membaca kod akan memahami maksud anda dengan lebih cepat.

    P.S. Melihat soalan awal anda, saya mendapati bahawa anda mungkin tidak begitu mahir dengan definisi fungsi, panggilan dan parameter Python, dsb. Anda disyorkan agar mengambil peluang ini untuk memahaminya. anda boleh disini Cuba tanya sejelas mungkin, kami akan bantu anda, semoga berjaya

    balas
    0
  • 巴扎黑

    巴扎黑2017-04-17 17:50:57

    1. Penyoal mungkin tidak memahami perbezaan antara parameter formal dan parameter sebenar

    2. Cuba elakkan mentakrifkan fungsi dalam gelung.

    3. julat(len(blabla)) bukan cara penulisan python
      Senarai dalam python itu sendiri menyokong lelaran, anda boleh "untuk i dalam LIST"

    4. .
    5. Anda boleh menggunakan "analisis senarai" untuk memudahkan kod.

    6. Nama pembolehubah/nama fungsi...tidak dapat difahami.

    balas
    0
  • ringa_lee

    ringa_lee2017-04-17 17:50:57

    Abang, mesti ada yang tak kena dengan logik abang.
    Atau anda boleh cuba membawa terus nombor siri semasa merentasi senarai:

    ` for i,v in enumerate (list): 
       print i , v 
    `

    balas
    0
  • PHP中文网

    PHP中文网2017-04-17 17:50:57

    Hanya masukkan i terus

    balas
    0
  • 黄舟

    黄舟2017-04-17 17:50:57

    Nama pembolehubah agak mengelirukan

    balas
    0
  • Batalbalas