在Python中获取数字的前缀
我刚开始学习Python编程,现在在做一个项目。
我有一个包含前缀和价格的列表,长得像这样:
LIST 1 LIST2
prefix price prefix price
44 5.7 44 3.5
45 3.8 45 5.6
678 4 78 1.0
6543 2 6543 1.5
12 8
还有更多内容...
这些数据在一个类对象里。
输入是电话号码。我可以输入一个电话号码,比如“4673345677”或者“6543346874”,然后我需要找出这个号码对应的最低价格。还有一个条件是,如果一个号码符合多个前缀,就应该使用最长的那个前缀。
这是我正在使用的Python类的结构:
class CallPrice:
def __init__(self,prefix,price):
self.prefix = prefix
self.price = price
def getPrefixLength(self):
return len(self.prefix)
我尝试把输入的电话号码拆分开来,然后比较前缀,但我的逻辑不太对。有没有人能帮我理清这个逻辑,或者给我一些建议?
2 个回答
-1
你可以试试用字典来代替,字典是由键值对组成的。
举个例子:
example_dictionary = {'prefix1' : price1, 'prefix2' : price2}
字典唯一的问题是你不能用同样的键两次。为了解决这个问题,你可以为每个键放多个值。比如,不用'prefix1' : price1,而是用'prefix1' : [price1, price2]。
编辑:好的,我测试了一些示例代码,下面是结果:
example_dictionary = {'065875': [1, 2, 4, 5], '06587': [1, 5, 70]}
cheapest_value = get_cheapest_value('0658')
def get_cheapest_value(number):
prefix_storage = []
for prefix in example_dictionary:
if number in prefix:
prefix_storage.append(prefix)
prefix = [i for i in prefix_storage if len(i)==max([len(n) for n in prefix_storage])]
prefix = prefix[0]
return min(example_dictionary.get(prefix))
1
如果我理解你的问题没错的话,我可能会创建一个字典的列表。
price_lists = [ [{'44': 5.7}, {'45': 3.8}, ...],
[{'44': 3.5}, {'45': 5.6}, ...] ] # list1's dicts, then list2's
先对你的字典做一些简单的预处理:
prefix_lengths = {len(key) for sublst in price_lists for dct in sublst for key in dct}
然后写一个函数,这个函数接收一个电话号码,根据字符的数量返回它的前缀。其实这就是一个更易读的字符串切片的别名。
def prefix_with_length(length, phonenum):
return phonenum.replace('-','')[:length]
# I also drop hyphens for a more robust code
最后遍历你的列表。
phone_number = "1-800-555-1234"
_result = result = float('inf')
for price_list in price_lists:
_result = min(price_list[prefix_with_length(length, phone_number)] for length in prefix_lengths)
# _result is the lowest price in that sublist
result = min(_result, result)
# result is the lowest so far
不过,这个问题有点不清楚。我不太确定你在比较什么,是想只用最长的前缀,还是在不同前缀之间比较,什么算是前缀,你的电话号码是字符串还是数字(应该是字符串!),或者还有其他很多因素,这些都会影响你想做的事情。能不能具体一点呢?
如果你是想在列表之间比较,可以试着组合前缀。
lists = [ [('44',5.7), ('45': 3.8), ... ], [('44', 3.5), ('45': 5.6), ...] ]
prefix_dict = {}
for lst in lists:
for key,value in lst:
prefix_dict.setdefault(key, list()).append(value)
prefixes = sorted(prefix_dict.keys(), key=lambda x: len(x), reversed=True)
phone_number = '18005551234'
for prefix in prefixes:
if phone_number.startswith(prefix):
result = min(prefix_dict[prefix])
break
else:
# handle no result