2

我有一个排序列表,如果它与列表中的模式匹配,我想插入一个字符串。

Example :

Sorted List
['Amy Dave', 'Dee Waugh', 'Eva A', 'Gin', 'Joy Kola', 'Kay Min', 'Mae', 'Pam Deing']

以上列表按排序顺序排列。我需要按排序顺序插入一个名称,如果该名称已经存在,那么它应该插入到现有名称之前。

Example 
Name  'Eva Henry'

由于 Eva 已经在列表中,因此在匹配模式后,应将其插入“Eva A”之前。如果名称不匹配,则应按排序顺序将其插入列表中。输出应该是这样的:

 Sorted List
    ['Amy Dave', 'Dee Waugh', 'Eva Henry', 'Eva A', 'Gin', 'Joy Kola', 'Kay Min', 'Mae', 'Pam Deing']

任何帮助将不胜感激。

谢谢

4

4 回答 4

3

在我看来,没有愚蠢的问题。如果名字是全名,只有名字是排序的关键,总有一些有趣的想法和解决问题的需要。您可以这样使用 bisect:

>>> fullnames = ['Amy Dave', 'Dee Waugh', 'Eva A', 'Gin', 'Joy Kola', 'Kay Min', 'Mae', 'Pam Deing']
>>> names = [full.split()[0] for full in fullnames]
>>> names
['Amy', 'Dee', 'Eva', 'Gin', 'Joy', 'Kay', 'Mae', 'Pam']

因此,我们有一个平行的名字列表,将用于查找另一个全名的位置xx(名字的提取x方式与前一种情况相同):

>>> xx = 'Eva Henry'
>>> x = xx.split()[0]
>>> x
'Eva'

现在,使用 bisect 在名字列表中找到想要的位置:

>>> import bisect
>>> pos = bisect.bisect_left(names, x)

然后更新两个列表:

>>> fullnames.insert(pos, xx)
>>> names.insert(pos, x)

结果如下:

>>> fullnames
['Amy Dave', 'Dee Waugh', 'Eva Henry', 'Eva A', 'Gin', 'Joy Kola', 'Kay Min', 'Mae', 'Pam Deing']
>>> names
['Amy', 'Dee', 'Eva', 'Eva', 'Gin', 'Joy', 'Kay', 'Mae', 'Pam']
于 2012-05-10T21:41:21.030 回答
0

这是我的解决方案,我认为它很容易

#spliting against whitespace
first_name = name.split()

#Stroting the first name of the user
first_name = first_name[0]

#Matching the pattern 
match = re.compile(first_name,re.IGNORECASE)
ind = ''

for i in sort_names:
        if re.match(match, i):
                ind = sort_names.index(i)
                break
                #If name matches for the first time end the loop and do insert name in the sorted list

if ind != '':
        sort_names.insert(ind, val)
        print ""
        print sort_names
else:
        bisect.insort(sort_names, val)
        print sort_names
于 2012-05-11T08:14:50.283 回答
0

好的,我会对此投反对票,但我不能让它站起来。这是一个糟糕的设计模式,如果这是家庭作业,你应该强烈抱怨。

我会将名称存储为具有频率('Fred Bloggs',2)的元组,或者使用 dict() 或其他东西:只是任何东西,但请不要这个。谷歌'python dict()'。

编辑:实际上没有订购 dict() 是吗?哦,好吧,我在生活中失败了。耸耸肩。

编辑:我的意思是元组列表。

于 2012-05-10T21:35:17.397 回答
0

这是一个完整的答案,可以满足您的要求,无论多么荒谬。我没有测试任何边缘情况。

sorta_sorted_list = ['Amy Dave', 'Dee Waugh', 'Eva A', 'Gin', 'Joy Kola', 'Kay Min', 'Mae', 'Pam Deing']

print sorta_sorted_list

def insert_kinda_sorted(name, sorta_sorted_list):
    new_list = []
    fname = name.split()[0]
    inserted = False
    for index in range(len(sorta_sorted_list)):
        if not inserted:
            if sorta_sorted_list[index].split()[0] == fname:
                new_list.append(name)
                inserted = True
            if sorta_sorted_list[index] > name:
                new_list.append(name)
                inserted = True
        new_list.append(sorta_sorted_list[index])

    return new_list

sorta_sorted_list = insert_kinda_sorted('Eva Henry', sorta_sorted_list)
print sorta_sorted_list

sorta_sorted_list = insert_kinda_sorted('Joe Blow', sorta_sorted_list)
print sorta_sorted_list

输出是:

['Amy Dave', 'Dee Waugh', 'Eva A', 'Gin', 'Joy Kola', 'Kay Min', 'Mae', 'Pam Deing']
['Amy Dave', 'Dee Waugh', 'Eva Henry', 'Eva A', 'Gin', 'Joy Kola', 'Kay Min', 'Mae', 'Pam Deing']
['Amy Dave', 'Dee Waugh', 'Eva Henry', 'Eva A', 'Gin', 'Joe Blow', 'Joy Kola', 'Kay Min', 'Mae', 'Pam Deing']
于 2012-05-10T21:24:42.707 回答