试图通过嵌套的词典来理解搜索

时间:2018-05-13 23:00:03

标签: python python-3.x dictionary

我有一个存储在嵌套$(function() { $(".sparkley:last").sparkleh({ color: "rainbow", count: 50, overlap: 5 }); }); $.fn.sparkleh = function( options ) { return this.each( function(k,v) { var $this = $(v).css("position","relative"); var settings = $.extend({ width: $this.outerWidth(), height: $this.outerHeight(), color: "#FFFFFF", count: 30, overlap: 0, speed: 1 }, options ); var sparkle = new Sparkle( $this, settings ); $this.on({ "mouseover focus" : function(e) { sparkle.over(); }, "mouseout blur" : function(e) { sparkle.out(); } }); }); } function Sparkle( $parent, options ) { this.options = options; this.init( $parent ); } Sparkle.prototype = { "init" : function( $parent ) { var _this = this; this.$canvas = $("<canvas>") .addClass("sparkle-canvas") .css({ position: "absolute", top: "-"+_this.options.overlap+"px", left: "-"+_this.options.overlap+"px", "pointer-events": "none" }) .appendTo($parent); this.canvas = this.$canvas[0]; this.context = this.canvas.getContext("2d"); this.sprite = new Image(); this.sprites = [0,6,13,20]; this.sprite.src = this.datauri; this.canvas.width = this.options.width + ( this.options.overlap * 2); this.canvas.height = this.options.height + ( this.options.overlap * 2); this.particles = this.createSparkles( this.canvas.width , this.canvas.height ); this.anim = null; this.fade = false; }, "createSparkles" : function( w , h ) { var holder = []; for( var i = 0; i < this.options.count; i++ ) { var color = this.options.color; if( this.options.color == "rainbow" ) { color = '#'+ ('000000' + Math.floor(Math.random()*16777215).toString(16)).slice(-6); } else if( $.type(this.options.color) === "array" ) { color = this.options.color[ Math.floor(Math.random()*this.options.color.length) ]; } holder[i] = { position: { x: Math.floor(Math.random()*w), y: Math.floor(Math.random()*h) }, style: this.sprites[ Math.floor(Math.random()*4) ], delta: { x: Math.floor(Math.random() * 1000) - 500, y: Math.floor(Math.random() * 1000) - 500 }, size: parseFloat((Math.random()*2).toFixed(2)), color: color }; } return holder; }, "draw" : function( time, fade ) { var ctx = this.context; ctx.clearRect( 0, 0, this.canvas.width, this.canvas.height ); for( var i = 0; i < this.options.count; i++ ) { var derpicle = this.particles[i]; var modulus = Math.floor(Math.random()*7); if( Math.floor(time) % modulus === 0 ) { derpicle.style = this.sprites[ Math.floor(Math.random()*4) ]; } ctx.save(); ctx.globalAlpha = derpicle.opacity; ctx.drawImage(this.sprite, derpicle.style, 0, 7, 7, derpicle.position.x, derpicle.position.y, 7, 7); if( this.options.color ) { ctx.globalCompositeOperation = "source-atop"; ctx.globalAlpha = 0.5; ctx.fillStyle = derpicle.color; ctx.fillRect(derpicle.position.x, derpicle.position.y, 7, 7); } ctx.restore(); } }, "update" : function() { var _this = this; this.anim = window.requestAnimationFrame( function(time) { for( var i = 0; i < _this.options.count; i++ ) { var u = _this.particles[i]; var randX = ( Math.random() > Math.random()*2 ); var randY = ( Math.random() > Math.random()*3 ); if( randX ) { u.position.x += ((u.delta.x * _this.options.speed) / 1500); } if( !randY ) { u.position.y -= ((u.delta.y * _this.options.speed) / 800); } if( u.position.x > _this.canvas.width ) { u.position.x = -7; } else if ( u.position.x < -7 ) { u.position.x = _this.canvas.width; } if( u.position.y > _this.canvas.height ) { u.position.y = -7; u.position.x = Math.floor(Math.random()*_this.canvas.width); } else if ( u.position.y < -7 ) { u.position.y = _this.canvas.height; u.position.x = Math.floor(Math.random()*_this.canvas.width); } if( _this.fade ) { u.opacity -= 0.02; } else { u.opacity -= 0.005; } if( u.opacity <= 0 ) { u.opacity = ( _this.fade ) ? 0 : 1; } } _this.draw( time ); if( _this.fade ) { _this.fadeCount -= 1; if( _this.fadeCount < 0 ) { window.cancelAnimationFrame( _this.anim ); } else { _this.update(); } } else { _this.update(); } }); }, "cancel" : function() { this.fadeCount = 100; }, "over" : function() { window.cancelAnimationFrame( this.anim ); for( var i = 0; i < this.options.count; i++ ) { this.particles[i].opacity = Math.random(); } this.fade = false; this.update(); }, "out" : function() { this.fade = true; this.cancel(); }, "datauri" : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAHCAYAAAD5wDa1AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozNDNFMzM5REEyMkUxMUUzOEE3NEI3Q0U1QUIzMTc4NiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozNDNFMzM5RUEyMkUxMUUzOEE3NEI3Q0U1QUIzMTc4NiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjM0M0UzMzlCQTIyRTExRTM4QTc0QjdDRTVBQjMxNzg2IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjM0M0UzMzlDQTIyRTExRTM4QTc0QjdDRTVBQjMxNzg2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+jzOsUQAAANhJREFUeNqsks0KhCAUhW/Sz6pFSc1AD9HL+OBFbdsVOKWLajH9EE7GFBEjOMxcUNHD8dxPBCEE/DKyLGMqraoqcd4j0ChpUmlBEGCFRBzH2dbj5JycJAn90CEpy1J2SK4apVSM4yiKonhePYwxMU2TaJrm8BpykpWmKQ3D8FbX9SOO4/tOhDEG0zRhGAZo2xaiKDLyPGeSyPM8sCxr868+WC/mvu9j13XBtm1ACME8z7AsC/R9r0fGOf+arOu6jUwS7l6tT/B+xo+aDFRo5BykHfav3/gSYAAtIdQ1IT0puAAAAABJRU5ErkJggg==" }; $.fn.imagesLoaded = function(callback){ var elems = this.filter('img'), len = elems.length, blank = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=="; elems.bind('load.imgloaded',function(){ if (--len <= 0 && this.src !== blank){ elems.unbind('load.imgloaded'); callback.call(elems,this); } }).each(function(){ // cached images don't fire load sometimes, so we reset src. if (this.complete || this.complete === undefined){ var src = this.src; // webkit hack from https://groups.google.com/group/jquery-dev/browse_thread/thread/eee6ab7b2da50e1f // data uri bypasses webkit log warning (thx doug jones) this.src = blank; this.src = src; } }); return this; }; 中的联系信息列表:

dict

并且我正在尝试编写一个函数,该函数将在每个条目中搜索用户输入的搜索字符串。

addressBook = {'Jim': {'name': 'James Marsh', 'address': '32 Morris Ave',
                           'phone': '654-987-3217'},
    'Leanne': {'name': 'Leanne Moss', 'address': '37 Shamrock Lane',
                           'phone': '123-456-7890'},
    'Chris': {'name': 'Christopher Philips', 'address': '49 Langley Court',
                           'phone': '321-654-9870'},
'Tim': {'name': 'Timothy Morris', 'address': '49 Langley Court',
                       'phone': '321-654-9870'}}

我的函数很好地遍历字典,但它只在键中找到搜索字符串。例如,如果我在def searchAllFields(addressBook): searchString = input("Enter a string to search for (enter to cancel): ") if searchString == "": return else: for key, value in addressBook.items(): inside = False for v in value.values(): if searchString in v: inside = True break if searchString in key or inside: print("The following contacts were found: ") print(addressBook[key]['name']) print(addressBook[key]['address']) print(addressBook[key]['phone'] + '\n') else: print("No contact matching the string {} was found.".format(searchString)) return 中搜索字符串,我可以找到James的信息,但如果我的搜索字符串是Jim,我希望能够找到Chris。我原以为Lang会查看值和键。为什么不呢?我怎么能解决这个问题?

2 个答案:

答案 0 :(得分:2)

执行else if时,您只检查该searchString in value词典的键。

您需要第二个循环来检查嵌套字典的值

value

无关注:for key, value in addressBook.items(): inside = False for v in value.values(): if searchString in v: inside = True break if searchString in key or inside: 正在检查子字符串,而不是完全匹配

答案 1 :(得分:1)

您需要测试输入是嵌套字典中 值的子字符串。

如果可以接受部分匹配,则可以使用带有生成器表达式的any来实现此目的:

for key, value in addressBook.items():
    if (searchString in key) or any(searchString in i for i in value.values()):
        print(...)

对此的一种变体是利用collections.namedtuple,这对结构化数据更有意义。这确实涉及一次性转换成本。

from collections import namedtuple

Contact = namedtuple('Contact', ['name', 'address', 'phone'])
d = {k: Contact(**v) for k, v in addressBook.items()}

for key, value in d.items():
    if (searchString in key) or any(searchString in i for i in value):
        print(...)