2015-06-04 37 views
0

比方說,我有可能包含來自以下兩元組成員的任意組合Python列表:確保子表的只有一個成員存在於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 

回答

0

不是最好的,但它應該工作

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 
0

也許這?

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 
0

免責聲明:我是一個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] 

注意,我洗牌,因爲你說的列表你想保留一個隨機元素。迭代是向後完成的,以在元素從列表中刪除後保持正確的索引。

1

我想不出任何單線程來解決這個問題,但我相信這是足夠簡潔的。

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。

相關問題