Das Python-Wörterbuch implementiert Pseudo-Slicing

Die Geschichte beginnt hier ...Fügen Sie hier eine Bildbeschreibung ein

Ich bin morgens aufgestanden und habe einen Kommentar gesehen. Es ist etwas umständlich. Wörterbuch-Slice? Ich habe
die Python-Informationen überprüft. Die 3.6-Version von Python hat den internen Algorithmus von dict neu geschrieben. Er war vor Version 3.6 ungeordnet.
Also ist es jetzt in Ordnung, aufgepasst Diese Reihenfolge ist die Einfügereihenfolge der Schlüssel,
aber wie schneidet man das Wörterbuch, obwohl es keinen Index gibt? Die Listenliste?
Fügen Sie dann den Schlüssel in die Liste ein und verwenden Sie die Abfangmethode der Liste selbst, um ihn zu schneiden.
Verwenden Sie dann den abgefangenen Schlüssel für new Die Wörterbuchzuweisung!
Also schrieb ich eine Wörterbuch-Slice-Version 1.0, als mein Gehirn heiß war

# 字典切片1.0版本
def dictcut(dict, start, end):
    # 临时存放字典的key
    temp = list(dict.keys())
    # 返回一个字典
    result = {
    
    }
    #切列表里的key
    temp = temp[start:end]
    for i in range(len(temp)):
        #用切完后的key列表对新的字典赋值
        result[temp[i]] = dict.get(temp[i])
    return result
#原字典
dict = {
    
    "zero": "0", "one": "1", "two": "2", "three": "3", "four": "4"}
print("dict:", dict)
start = eval(input("起始位置:"))
end = eval(input("结束位置:"))
#调用切片方法
newdict =dictcut(dict, start, end)
print("dictcut(dict,%d,%d):" % (start, end), newdict)

Führen Sie dann das Ergebnis aus

  1. Die beiden Zahlen sind positiv und überschreiten nicht die Grenze, normales Abfangen
    Fügen Sie hier eine Bildbeschreibung ein

  2. Wenn ich von 2 bis zum Ende abfangen möchte, ist die Endkoordinate -1, aber das Übergeben von [2: -1] fängt [2, -1) ab, und das letzte wird nicht abgefangen. Wenn ich [2: 0] übergebe, sieht es so aus Das Folgende ist dasselbe.
    Fügen Sie hier eine Bildbeschreibung einListen Sie also [2:] Abschnitte von 2 bis zum letzten auf, was hinsichtlich der Parameterübertragung sehr problematisch ist.

  3. Wenn das Abfangen von [-5, -3] in Ordnung ist, aber [-3, -5] nicht funktioniert. Fügen Sie hier eine Bildbeschreibung einFügen Sie hier eine Bildbeschreibung ein
    Zusammenfassend hoffe ich, dass mein Wörterbuchschnitt in 360 Grad ohne Sackgassen von positiv nach negativ, von vorne nach hinten geschnitten werden kann Vorwärts schneiden, rückwärts schneiden

Die Dictionary Slice 2.0 Version ist also da!

# 字典切片2.0
def dictcut(dict, start, end):
    # 临时存放字典的key
    temp = list(dict.keys())
    # 返回一个字典
    result = {
    
    }
    # 分两个分支 1.start和end在可切片范围内 2.不在范围内
    if start <= len(temp) - 1 and start >= -len(temp) and end <= len(temp) - 1 and end >= -len(temp):
        #start大于end,且下标不重叠
        if start > end and start - 1 != len(temp) + end:
            #start和end同时为大于等于0
            if start >= 0 and end >= 0:
                # (4,2) 4 0 1
                for i in range(start, len(temp)):
                    result[temp[i]] = dict.get(temp[i])
                for i in range(0, end):
                    result[temp[i]] = dict.get(temp[i])
            # start和end同时小等于0
            if start <= 0 and end <= 0:
                # (-1,-3) 4 0 1
                for i in range(len(temp) + start, len(temp)):
                    result[temp[i]] = dict.get(temp[i])
                for i in range(0, len(temp) + end):
                    result[temp[i]] = dict.get(temp[i])
            # start大于0,end小于0
            if start >= 0 and end < 0:
                # (1,-2) 1 2
                for i in range(start, len(temp) + end):
                    result[temp[i]] = dict.get(temp[i])

        # end大于start,且下标不重叠
        elif end > start and start + len(temp) != end - 1:
            # start和end同时为大于等于0
            if start >= 0 and end >= 0:
                # (0,3) 0 1 2
                for i in range(start, end):
                    result[temp[i]] = dict.get(temp[i])
            # start和end同时大小等于0
            if start <= 0 and end <= 0:
                # (-4,-1) 1 2 3
                for i in range(len(temp) + start, len(temp) + end):
                    result[temp[i]] = dict.get(temp[i])
            # end大等于0,start小于0
            if end >= 0 and start < 0:
                # (-1,3) 4 0 1 2
                for i in range(len(temp) + start, len(temp)):
                    result[temp[i]] = dict.get(temp[i])
                for i in range(end):
                    result[temp[i]] = dict.get(temp[i])
        #start等于end,或者下标重叠
        elif end == start or start + len(temp) == end - 1 or end <= 0 and start - 1 == len(temp) + end:
            print("切了个寂寞!")
    # start或者end不在范围内
    else:
        print("传入参数有误!")
    return result
#原字典
dict = {
    
    "zero": "0", "one": "1", "two": "2", "three": "3", "four": "4"}
print("dict:", dict)
print("字典切割:左闭右开")
start = eval(input("起始位置:"))
end = eval(input("结束位置:"))
newdict = dictcut(dict, start, end)
# 如果返回的字典不为空,打印结果
if len(newdict) != 0:
    print("dictcut(dict,%d,%d):" % (start, end), newdict)

Betriebsergebnis:

  • Wenn nicht in ReichweiteFügen Sie hier eine Bildbeschreibung ein

  • Wenn sich die Koordinaten überlappen, überlappen und einsam schneiden?Fügen Sie hier eine Bildbeschreibung ein

  • 360 ° kein Totwinkelschnitt Schnitt (normaler Schnitt)
    positive Zahl Fügen Sie hier eine Bildbeschreibung ein
    negative ZahlFügen Sie hier eine Bildbeschreibung ein

  • 360 ° kein Totwinkelschnitt (Schnitt von hinten nach
    vorne ) positive Zahl Fügen Sie hier eine Bildbeschreibung ein
    negative ZahlFügen Sie hier eine Bildbeschreibung ein

Der 2.0-Code ist umständlicher, aber der Effekt des Wörterbuchschneidens ist immer noch deutlich sichtbar ~~~

Ich denke du magst

Origin blog.csdn.net/weixin_44864260/article/details/109309476
Empfohlen
Rangfolge