2014-10-08 17 views
-3

我想創建一個列表,其中包含僅有9和8的數字,按升序排列,介於0到1000之間。如何通過Python中的lambda函數執行此操作?如何創建一個lambda函數來打印Python中包含x和y的數字?

預期輸出是:

[8, 9, 88, 89, 98, 99, 888, 889, 898, 899, 988, ...] 
+3

爲什麼你想在一個lambda辦呢? – 2014-10-08 13:06:28

+5

然後說。 lambda!=性能。 – 2014-10-08 13:07:51

+0

你可以使用可能(或不可能)更快的列表理解。 – Scironic 2014-10-08 13:09:04

回答

3

我這裏不使用lambda所有,但將使用itertools.product()而不是生產數字:

from itertools import product  
[int(''.join(d)) for l in range(1, 4) for d in product('89', repeat=l)] 

這並不絕對最低所需的輸出所需的工作,對列表進行硬編碼。

的擴展版本將是:

results = [] 
# ranging from 1 to 3 digits 
for l in range(1, 4): 
    # all combinations of l digits out of 8 and 9 
    for digits in product('89', repeat=l): 
     # put the digits together into one string, convert to an integer 
     value = int(''.join(digits)) 
     results.append(value) 

演示:

>>> from itertools import product 
>>> [int(''.join(d)) for l in range(1, 4) for d in product('89', repeat=l)] 
[8, 9, 88, 89, 98, 99, 888, 889, 898, 899, 988, 989, 998, 999] 

你可以用列表理解的功能,以指定要使用的數字和數字的最大數生產:

def generate_numbers(digits, length): 
    return [int(''.join(d)) for l in range(length) for d in product(digits, repeat=l + 1)] 

generate_numbers('89', 3) 
generate_numbers('123', 5) 
+0

哇! 你介意添加一個解釋嗎?這對於像我這樣的學習者會有幫助。 – 2014-10-08 13:13:24

+0

@RakeshS:添加了一個非list-comp版本,包含評論。請閱讀'itertools.product()'文檔,並嘗試使用該工具生成的輸出來瞭解其工作原理。 – 2014-10-08 13:18:06

+0

@MartijnPieters,刪除我的答案,贊成這一個。使用itertools的'product'顯然是最好的解決方案。 – brunsgaard 2014-10-08 13:23:44

-1

您wa NT列表,以便您可以使用

print [x for x in arr if ('8' in str(x) or '9' in str(x))] 

其中ARR是你的清單

+1

這是非常低效的,假設'arr'只是'range(1000)'這也是不正確的,因爲它會捕獲例如'18',這是無效的。 – CoryKramer 2014-10-08 13:09:50

+0

我的不好。 Missunderstud這個問題。 – 2014-10-08 13:13:03

相關問題