[英]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.