我遇到一個面試問題來實作以下功能:
def f(sequence_type, element):
pass
例如:
f(str, 'a') return 'a'
f(list, 'a') return ['a']
f(list, 'ab') return ['ab']
f(list, 1) return [1]
f(tuple, 1) return (1, )
f(set, 1) return {1}
f(str, 1) return '1'
f(str, [1]) return '[1]'
我想出了一個天真的方法:
def f(sequence_type, element):
return sequence_type(element)
此方法適用于str. 但是,我會出錯,因為tupe(1)會引發TypeError: 'int' object is not iterable.
當然,我可以寫一堆if else來檢查型別并使用特定的方式來生成一個元素序列,例如[x] (x,)等等。有沒有干凈和通用的方法來做到這一點?
uj5u.com熱心網友回復:
您可以通過以下方式近似要求:
from collections.abc import Iterable
def f2(sequence_type, *elements):
if isinstance(elements[0],Iterable):
return sequence_type(elements[0])
else:
return sequence_type(elements[:1])
這是接近的,但失敗f(list, 'ab')回傳['a', 'b']不['ab']
很難理解為什么人們會期望Python函式將長度為 2 的字串與長度為 1 的字串不同地對待。語言本身說list('ab') == ['a', 'b'].
我懷疑這是從將字符和字串視為不同資料型別的 C 等語言匯入的期望,換句話說,我對問題的這一方面有所保留。
但是說您不喜歡規范并不是成功的秘訣,因此必須將特殊處理編碼為:
def f(sequence_type, elements):
if isinstance(elements, str) and len(elements) > 1 and sequence_type != str:
return sequence_type([elements])
else:
return f2(sequence_type, elements)
結果是通用的,但特殊外殼不能真正稱為干凈。
uj5u.com熱心網友回復:
的示例str并不真正符合函式的描述,但這里有一些通過您的測驗用例的實作 - 您希望在轉換之前先將元素包裝到元組/串列/集合的集合中:
def f(sequence_type, element):
return sequence_type([element] if sequence_type != str else element)
def f(sequence_type, element):
return sequence_type((element,) if sequence_type != str else element)
def f(sequence_type, element):
return sequence_type({element} if sequence_type != str else element)
uj5u.com熱心網友回復:
你可以試試這個:
def f(sequence_type, element):
g = lambda *args: args
return str(g(element)[0]) if str==sequence_type else sequence_type(g(element))
uj5u.com熱心網友回復:
我認為你想改變文字的行為,特別是對于str- list。由于更改由您決定,這意味著您必須進行案例研究if-else或者以某種棘手的方式繞過它。在我的解決方案中,我選擇了后者,但我只需要str-case的條件來規范其行為。映射是基于字串的,應該進行評估。
def f(sequence_type, element):
type_literal_map = {tuple: '({},)', set: '{{{}}}', list: '[{}]', str: '"{}"'}
if isinstance(element, str) and not isinstance(sequence_type(), str):
element = f'"{element}"'
return eval(type_literal_map[sequence_type].format(element))
l = [(str, 'a'), (list, 'a'), (list, 'ab'), (list, 1), (tuple, 1), (set, 1), (str, 1), (str, [1])]
for t in l:
print(t[0].__name__, t[1],'->', f(*t))
輸出
str a -> a
list a -> ['a']
list ab -> ['ab']
list 1 -> [1]
tuple 1 -> (1,)
set 1 -> {1}
str 1 -> 1
str [1] -> [1]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/335409.html
上一篇:Python:遍歷串列并回傳串列中所有字串的元組排列?[復制]
下一篇:串列的分隔符串列
