使用通配符过滤字符串元素列表并附加到列表

时间:2018-01-16 01:32:45

标签: python

我试图在将某个关键字搜索到单个列表时附加对象,其内容如下:

dict_list = defaultdict(list)
query_all_tags = ... #some other funcs that will generate dict of lists...

# Example output of query_all_tags
#['limit_projA', 'limit_remote_server10', 'limit_remote_server2', 'limit_alias']
#['limit_projB', 'limit_remote_server10', 'limit_alias']

for tag in query_all_tags:
    if 'limit_remote_server2' in tag:
        dict_list['server2'].append(tag)
    if 'limit_remote_server10' in tag:
        dict_list['server10'].append(tag)

如果使用上面的示例,我将首先获得server2server10列表中的元素(带有' limit_projA'的元素)。

然后我尝试使用count来过滤掉tag是否有limit_remote_server(如通配符),如下所示:

for tag in query_all_tags:
    if tag.count('limit_remote_server') > 1:
        dict_list['misc'].append(tag)
    if 'limit_remote_server2' in tag:
        dict_list['server2'].append(tag)
    if 'limit_remote_server10' in tag:
        dict_list['server10'].append(tag)

但似乎count无效,因为它会返回0值。

我应该做的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

问题是count()没有做通配符,也不应该这样做,因为你只是放置了文本而没有暗示外卡应该是什么。

无论如何,您可以使用remap()的组合来获得您想要的内容:

my_count = lambda my_pattern, my_list: sum(list(map(lambda x: re.match(my_pattern, x) is not None, my_list)))
for tag in query_all_tags:
    if my_count(r'^limit_remote_server\d+', tag) > 1:
        dict_list['misc'].append(tag)
    elif 'limit_remote_server2' in tag:
        dict_list['server2'].append(tag)
    elif 'limit_remote_server10' in tag:
        dict_list['server10'].append(tag)

如果您希望代码更具可读性,请不要使用lambda,而是以旧式方式定义函数。此外,在计数后使用elif即使在您已经附加到dict_list['misc']之后也要执行fnmatch

您还可以使用大量类似问题中提到的from django.shortcuts import render, get_object_or_404 from django.http import HttpResponse from django.template import loader from .models import Album, Song # Create your views here. def index(request): all_albums = Album.objects.all() template = loader.get_template('music/index.html') context = {'all_albums' : all_albums,} return render(request, 'music/index.html', context) def detail(request, album_id): album = get_object_or_404(Album, pk=album_id) return render(request, 'music/detail.html', {'album' : album}) def favorite(request, album_id): album = get_object_or_404(Album, pk=album_id) print("favorite stuff happens here") try: selected_song = album.song_set.get(pk=int(request.POST['song'])) except (KeyError, Song.DoesNotExist): return render(request, 'music/detail.html', { 'album' : album, 'error_message': 'Did not select a valid song' }) else: selected_song.favorite = True selected_song.save() return render(request, 'music/detail.html', {'album' : album}) Python wildcard search in string