我试图在将某个关键字搜索到单个列表时附加对象,其内容如下:
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)
如果使用上面的示例,我将首先获得server2
和server10
列表中的元素(带有' 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
值。
我应该做的最佳方法是什么?
答案 0 :(得分:0)
问题是count()
没有做通配符,也不应该这样做,因为你只是放置了文本而没有暗示外卡应该是什么。
无论如何,您可以使用re
和map()
的组合来获得您想要的内容:
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