[英]2-sum problem: given an unsorted list of ints, find if two elements sum to a given target. How to make my code more Pythonic?
I'm trying to learn about PEP-8 guidelines, writing Pythonic code, and about Python's standard libraries (am a day into this journey).我正在尝试了解 PEP-8 指南、编写 Pythonic 代码以及 Python 的标准库(这是此旅程的一天)。 Suggestions to make the following piece of code (including comments) more Pythonic would be much appreciated.让以下代码(包括注释)更加 Pythonic 的建议将不胜感激。 I know the algorithm could be improved, but this isn't a priority at the moment - but please do write if you have an elegant solution!我知道算法可以改进,但这不是目前的优先事项 - 但如果你有一个优雅的解决方案,请写!
I've run it through the following PEP-8 checker, so hopefully the basics are not a problem: http://pep8online.com/checkresult我已经通过以下 PEP-8 检查器运行它,所以希望基础不是问题:http: //pep8online.com/checkresult
import collections
def two_sum(input_list, target):
# Determine if two elements in list add to target
# dict_of_counts - key: element from input_list, value: count of element
dict_of_counts = collections.Counter(input_list)
for key in dict_of_counts:
complement_key = target - key
if complement_key in dict_of_counts:
# Corner case: complement_key is the same as key,
# but the count is one (so threat of a false +ve)
if complement_key != key:
return(True)
elif dict_of_counts[complement_key] > 1:
return(True)
return(False)
PS My first question ever : O ! PS我的第一个问题:哦!
If you want to improve your PEP-8 skills, I highly recommend using a linter such as flake8 .如果您想提高您的 PEP-8 技能,我强烈建议您使用 flake8 之类的linter 。 It is really good in finding any PEP-8 violations, and while you're trying to make flake8 happy you'll learn all the ins- and outs as you go.发现任何 PEP-8 违规行为非常好,当你试图让 flake8 开心时,你会在你去的过程中学习所有的细节。
from typing import List, Tuple
if complexity is not an issue the most pythonic way (for me) is:如果复杂性不是问题,最pythonic的方式(对我来说)是:
def pair_sum_v1(array: List[int], s: int) -> List[Tuple]:
"""
:param array: list of integers
:param s: sum
:return: list of unique pairs [(a1,b1), (a2,b2)] where ai+bi=s
"""
pair_sums = [(num, s - num) for idx, num in enumerate(array) if s - num in array[idx:]]
return pair_sums
if you want to make it faster:如果你想让它更快:
def pair_sum_v2(array: List[int], s: int) -> List[Tuple]:
"""
:param array: list of integers
:param s: sum
:return: list of unique pairs [(a1,b1), (a2,b2)] where ai+bi=s
"""
explored_integers = []
pair_sums = []
for idx, num in enumerate(array):
if num not in explored_integers:
complement = s - num
if complement in array[idx:]:
pair_sums.append((num, complement))
explored_integers.extend([num, complement])
return pair_sums
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.