以下函数有什么好名字(在Python中实现)?
def a_function(element, a_set):
if a_set[0] == element:
return a_set[1]
if a_set[1] == element:
return a_set[0]
assert 'A' == a_function('B', ['A', 'B'])
答案 0 :(得分:3)
我会使用不同的函数名称,不同的参数名称和文档字符串来明确发生了什么,例如:
def get_other(current, both):
"""Return the element from 'both' that is not 'current'."""
...
请注意,both
表示没有任何啰嗦的对,并且未指定所需的type
。
您可以使用自己的实现或Joel的;只要函数完成它所说的内容,它的实现方式并不重要(除了性能问题,边缘情况等)。
但是,要使用不可索引的容器(例如set
或dict
的键)而不必明确测试both
是什么,我可能会选择:
def get_other(current, both):
"""Return the element from 'both' that is not 'current'."""
for item in both:
if item != current:
return item
确实,如果len(both) > 2
,这将只返回其中不等于current
的第一项 - 如果这不是所需的行为,您可以添加对此的检查。
答案 1 :(得分:1)
作为jonrsharpe建议的替代方案(我喜欢它,不要误解我),这是一个使用问题标题中提到的集合的单行版本:
>>> def get_other(element, pair):
... """Get the other element from a pair"""
... return (set(pair) - set([element])).pop()
...
这会计算element
和pair
的集合差异,然后pop
是结果集中的随机成员(理想情况下应该是1的大小)。
以下是一些处理不同可迭代数据类型的示例:
>>> get_other('B', {'A', 'B'})
'A'
>>> get_other('B', ['A', 'B'])
'A'
>>> get_other('A', ['A', 'B'])
'B'
>>> get_other('B', {'A': 1, 'B': 2})
'A'
>>> get_other('B', 'AB')
'A'
>>> get_other(5, {1, 5})
1
如果len(pair) > 2
或element not in pair
,您获取的元素未定义,但始终是来自pair
的元素:
>>> get_other('B', 'ABC')
'C'
>>> get_other('B', 'ABCDEF')
'E'
最后,如果pair
为空或pair == {element}
,则会引发KeyError
:
>>> get_other('B', 'B')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in get_other
KeyError: 'pop from an empty set'