簡體   English   中英

如何在python字典中選擇附近的鍵?

[英]How to select the nearby key in python dictionary?

請考慮以下 Python 代碼:

def allot():
    dict2 = {'1': 1, '2': 1, '3': 0, '4': , '5': 1}
    allotted_id = None

    for k in dict2:
        usr_id = 3
        if (str(usr_id) != k):
            continue;

        if ((str(usr_id) == k) and (dict2[str(usr_id)] == 1)):

            print("\n user Requested Id : ", usr_id)
            print("\n user Requested Id is available ! ")
            allotted_id = k
            break;
        else:
            print("\n user Requested Id : ", usr_id)
            print("\n user Requested Id is not available ! ")
            usr_id = usr_id + 1
            if (dict2[str(usr_id)] == 1):
                allotted_id = usr_id
                break;

    print('So allotted dict2 Id', allotted_id)

allot()

"dict2" 中if values == 1 then it is active or if values == 0那么它是非活動的。 在這里,將usr_idusr_id中的密鑰 id dict2

情況 1: dict2 = {'1': 1, '2': 1, '3': 1, '4': 1, '5': 1} 現在 usr_id==3 和 dict2 鍵 '3'==1。 所以分配id=3

情況 2: dict2 = {'1': 1, '2': 1, '3': 0, '4': 1, '5': 1} 現在usr_id==3和 dict2 鍵 '3'==0 。 然后分配下一個活動 id。因此分配 id=4。

情況 3: dict2 = {'1': 1, '2': 1, '3': 0, '4': 0, '5': 1} 現在usr_id==3和 dict2 鍵 '3' & '4'==0 。 所以下一個最接近usr_id活動 id 想要分配(只是鍵 id '2')。怎么做?

指導我的案例 3場景。 提前致謝。

假設您不希望對代碼進行效率更改,您將for k in dict2循環中覆蓋for k in dict2

def allot():
    dict2 = {'1': 1, '2': 1, '3': 0, '4': , '5': 1}
    allotted_id = None

    usr_id = 3  # Move this out of the loop

    for k in dict2:       
        if (str(usr_id) != k):
            continue;

        if ((str(usr_id) == k) and (dict2[str(usr_id)] == 1)):

            print("\n user Requested Id : ", usr_id)
            print("\n user Requested Id is available ! ")
            allotted_id = k
            break;
        else:
            print("\n user Requested Id : ", usr_id)
            print("\n user Requested Id is not available ! ")
            usr_id = usr_id + 1
            if (dict2[str(usr_id)] == 1):
                allotted_id = usr_id
                break;

    print('So allotted dict2 Id', allotted_id)

allot()

您可以編寫此代碼以進行更多檢查並更多地利用字典結構...

def allot():
    # Variables to Enter
    dict2 = {1: 1, 2: 1, 3: 0, 4: 0, 5: 1}
    usr_id = 3

    # Boolean Variables
    allotted_id = None
    upper_exhausted = False
    lower_exhausted = False

    # Need to calculate the min and max to know when to stop searching
    max_id = max(dict2.keys())
    min_id = min(dict2.keys())

    # Check the initial ID
    if dict2[usr_id] == 0:
        print("ID {} inactive. Continuing search.".format(usr_id))
    else:
        allotted_id = usr_id

    # Run two searches - one increasing through the dictionary 
    # and one decreasing through the dictionary
    upper_usr_id = usr_id + 1
    lower_usr_id = usr_id - 1

    # Run loop whilst the max and min dict key haven't been reached 
    # AND there's no allotted ID.
    while not allotted_id:
        if not upper_exhausted:
            if dict2[upper_usr_id] == 0:
                print("ID {} inactive. Continuing search.".format(upper_usr_id))
                if upper_usr_id < max_id:
                    upper_usr_id += 1
                else:
                    upper_exhausted = True  # Maximum has been reached
            else:
                allotted_id = upper_usr_id
        if not lower_exhausted:
            if dict2[lower_usr_id] == 0:
                print("ID {} inactive. Continuing search.".format(lower_usr_id))
                if lower_usr_id > min_id:
                    lower_usr_id -= 1
                else:
                    lower_exhausted = True  # Minimum has been reached
            else:
                allotted_id = lower_usr_id

        # Exhausted all values - No Data value
        if upper_exhausted and lower_exhausted:
            allotted_id = -999

    if allotted_id == -999:
        print("Couldn't allot an ID")
    else:
        print("Allotted ID is: {}".format(allotted_id))

allot()

我建議采用不同的方法(不知道您的方法有多靈活)-

像這樣存儲您的數據

dict2 = {"1": {1, 2, 5}, "0": {3, 4}} # 1 for available Ids and 0 for allocated

現在對於任何傳入的用戶 ID

if usr_id in dict2["1"]:
    allotted_id = usr_id
elif usr_id in dict2["0"]:
    # either return the first available Or
    # traverse and return the next higher user id available 
else:
    # exception

我會使用 numpy:

user_ids = np.array(range(5))
valid_user = np.array([1, 1, 0, 0, 1])
anchor_id = 2

dist_from_anchor = np.abs(user_ids - anchor_id)
dist_from_anchor[valid_user == 0] = len(user_ids) +1 #will not be the min
print(np.argmin(dist_from_anchor))

我使用了最小的 user_id 作為 0(只是一個 cs 的東西......)但你可以輕松地將它更改為 1......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM