簡體   English   中英

確保子列表中只有一個成員存在於Python列表中

[英]Ensure a only single member of a sublist is present in a Python list

假設我有一個Python列表,其中可能包含來自以下兩個元組的成員的任意組合:

legal_letters = ('a', 'b', 'c')
legal_numbers = (1, 2, 3)

因此合法組合清單將包括

combo1 = ['a', 1, '3']
combo2 = ['c']
combo3 = ['b', 2, 1, 'c']

任何長度,任何組合。 您可以假定組合列表中沒有重復的字符。 我想將一個函數應用於那些修改它們的組合(就地),以使它們最多包含一個元組的單個成員-就是數字。 數字元組的“選擇”成員應隨機選擇。 我也不在乎訂單是否在此過程中受到破壞。

def ensure_at_most_one_number(combo):
 # My first attempts involved set math and a while loop that was 
 # pretty gross, I'll spare you guys the details.  I'm sure I could get it to work
 # but I figured there might be a one-liner or some fancy itertools out there
 return combo


# Post transformation
combo1 = ['a', '1']
combo2 = ['c']
combo3 = ['c', 'b', 2] # Mangled order, not a problem

我想不出任何一種解決方案,但是我相信這很簡潔。

    def only_one_number(combo):
        import random

        try:
            number = random.choice([x for x in combo if x in legal_numbers])
            combo[:] = [x for x in combo if x in legal_letters]
            combo.append(number)
        except IndexError:
            pass

如果您沒有立即看到需要進行異常處理,則需要捕獲因嘗試將空列表傳遞給random.choice()而導致的IndexError。

不是最好的,但應該可以

numbers = []
for i in legal_numbers:
  if i in combo:
    numbers.append(i)
    combo.remove(i)
if len(numbers) == 0:
  return combo
combo.append(random.choice(numbers))
return combo

也許這個?

def ensure_at_most_one_number(combo):
    i = len(combo) - 1      # start with the last element
    found_number = False

    while i >= 0:
        try:
            int(combo[i])   # check element is a number
            if  found_number == True:
                del combo[i]    # remove it if a number already found
            else:
                found_number = True
        except ValueError:
            pass             # skip element if not a number
        i -= 1

    return combo

免責聲明:我本人是python初學者,所以可能會有更好的方法,但這就是我的方法:

import random

def ensure_at_most_one_number(combo, legal_numbers) :

    random.shuffle(combo)
    first_number = True

    for i in range(len(combo)-1, -1, -1) :
        if combo[i] in legal_numbers :
            if first_number :
                first_number = False
            else :
                del combo[i]

請注意,由於您說過要保留隨機元素,因此我對列表進行了混洗。 從列表中刪除元素后,將向后進行迭代以保留正確的索引。

暫無
暫無

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

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