在Python中获取数字的前缀

0 投票
2 回答
1175 浏览
提问于 2025-04-18 16:45

我刚开始学习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

撰写回答