Path: csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!news.albasani.net!rt.uk.eu.org!newsfeed.xs4all.nl!newsfeed2a.news.xs4all.nl!xs4all!post.news.xs4all.nl!not-for-mail Return-Path: X-Original-To: python-list@python.org Delivered-To: python-list@mail.python.org X-Spam-Status: OK 0.005 X-Spam-Evidence: '*H*': 0.99; '*S*': 0.00; 'column': 0.07; 'only,': 0.07; "'a'": 0.09; 'received:80.91': 0.09; 'received:80.91.229': 0.09; 'received:gmane.org': 0.09; 'received:list': 0.09; 'seemed': 0.09; 'mostly': 0.14; "'a',": 0.16; '0))': 0.16; 'bool': 0.16; 'boolean': 0.16; 'fine.': 0.16; 'received:80.91.229.3': 0.16; 'received:dip0.t-ipconnect.de': 0.16; 'received:plane.gmane.org': 0.16; 'received:t-ipconnect.de': 0.16; 'scientists': 0.16; 'subject:expression': 0.16; 'wrote:': 0.18; 'alex': 0.19; 'skip:f 30': 0.19; 'appears': 0.22; 'code,': 0.22; 'header:User-Agent:1': 0.23; 'sorry,': 0.24; 'script': 0.25; 'header:X-Complaints-To:1': 0.27; 'van': 0.27; 'absolute': 0.30; 'code': 0.31; 'keys': 0.31; 'probably': 0.32; 'interface': 0.32; 'lab': 0.33; 'problem': 0.35; "can't": 0.35; 'tool': 0.35; 'but': 0.35; 'there': 0.35; 'reality': 0.36; 'subject:?': 0.36; 'application': 0.37; 'too': 0.37; 'list': 0.37; 'sometimes': 0.38; 'problems': 0.38; 'to:addr :python-list': 0.38; 'does': 0.39; 'itself': 0.39; 'to:addr:python.org': 0.39; 'enough': 0.39; 'mailing': 0.39; 'received:org': 0.40; 'how': 0.40; 'expression': 0.60; 'such': 0.63; 'choose': 0.64; 'more': 0.64; 'here': 0.66; 'therefore': 0.72; 'theoretical': 0.74; 'protect': 0.79; 'forth': 0.81; 'dare': 0.91; 'trouble.': 0.91 X-Injected-Via-Gmane: http://gmane.org/ To: python-list@python.org From: Peter Otten <__peter__@web.de> Subject: Re: dict to boolean expression, how to? Date: Fri, 01 Aug 2014 17:44:27 +0200 Organization: None References: <53db8bd8$0$2976$e4fe514c@news2.news.xs4all.nl> <53dba39e$0$2976$e4fe514c@news2.news.xs4all.nl> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="nextPart1761258.6yknDyUaQs" X-Gmane-NNTP-Posting-Host: p57bd8339.dip0.t-ipconnect.de User-Agent: KNode/4.11.5 X-BeenThere: python-list@python.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: General discussion list for the Python programming language List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Newsgroups: comp.lang.python Message-ID: Lines: 155 NNTP-Posting-Host: 2001:888:2000:d::a6 X-Trace: 1406907906 news.xs4all.nl 2889 [2001:888:2000:d::a6]:53043 X-Complaints-To: abuse@xs4all.nl Xref: csiph.com comp.lang.python:75489 --nextPart1761258.6yknDyUaQs Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7Bit Alex van der Spek wrote: > I do know eval() lends itself to code injection but can't say I am > fully aware of its dangers. It seemed like a handy tool to me. In a lab if you don't need to protect your script against attacks from outside eval() (and exec()) is fine. If the data fed to eval() is completely under your control (think collections.namedtuple) eval() is also fine. Adding a public web interface on such a lab application means trouble. > This newsgroup scares me, If you dare say that you are not scared enough ;) > it appears to be for professional computer > scientists only, the theoretical part is sometimes too much for this > practical physicist with an old background in FORTRAN. That sounds like you are experienced enough to say "There may be problems with this code, but I choose not to care about them this time -- at my own risk" > Is there a better place to ask questions of this nature? There is the tutor mailing list which is mostly geared at absolute beginners, does more hand-holding, and the threads are more likely to stay on topic. You might take a look, but with your background you are probably better off here. > I am sorry, the problem is ill posed. > > 'a', 'A' and so forth are my failed attempt to shorthand. > > In reality the dict's keys are column names in a pandas dataframe df. > > The boolean expression would therefore look like: > > bool = ((df['a'] == 1) & (df['A'] == 0) | > (df['b'] == 1) & (df['B'] == 0) | > (df['c'] == 1) & (df['C'] == 0)) This is how it might look without eval(): #untested result = functools.reduce(operator.or_, ((v == 1) & (df[k.upper()] == 0) for k, v in df.items() if k.islower())) And here is an eval-based solution: # untested expr = "|".join( "((df[{}] == 1) | (df[{}] == 0))".format(c, c.upper()) for c in df is c.islower()) result = eval(expr) --nextPart1761258.6yknDyUaQs Content-Type: application/x-desktop; name="konsole.desktop" Content-Disposition: attachment; filename="konsole.desktop" Content-Transfer-Encoding: base64 W0Rlc2t0b3AgRW50cnldClR5cGU9QXBwbGljYXRpb24KVHJ5RXhlYz1rb25zb2xlCkV4ZWM9a29u c29sZQpJY29uPXV0aWxpdGllcy10ZXJtaW5hbApUZXJtaW5hbD1mYWxzZQpDYXRlZ29yaWVzPVF0 O0tERTtTeXN0ZW07VGVybWluYWxFbXVsYXRvcjsKWC1Eb2NQYXRoPWtvbnNvbGUvaW5kZXguaHRt bApYLURCVVMtU3RhcnR1cFR5cGU9VW5pcXVlClgtS0RFLVN0YXJ0dXBOb3RpZnk9dHJ1ZQpYLUtE RS1BdXRob3JpemVBY3Rpb249c2hlbGxfYWNjZXNzCgpOYW1lPUtvbnNvbGUKTmFtZVthZl09S29u c29sZQpOYW1lW2FyXT3Zg9mI2YbYs9mI2YQKTmFtZVthc109S29uc29sZQpOYW1lW2FzdF09S29u c29sZQpOYW1lW2JlXT1Lb25zb2xlCk5hbWVbYmVAbGF0aW5dPUtvbnNvbGUKTmFtZVtiZ109S29u c29sZQpOYW1lW2JuXT3gppXgpqjgprjgp4vgprIKTmFtZVtibl9JTl09S29uc29sZQpOYW1lW2Jy XT1Lb25zb2xlCk5hbWVbYnNdPUtvbnpvbGEKTmFtZVtjYV09S29uc29sZQpOYW1lW2NhQHZhbGVu Y2lhXT1Lb25zb2xlCk5hbWVbY3NdPUtvbnNvbGUKTmFtZVtjc2JdPUvDsm5zb2xhCk5hbWVbY3ld PUtvbnNvbGUKTmFtZVtkYV09S29uc29sZQpOYW1lW2RlXT1Lb25zb2xlCk5hbWVbZWxdPc6azr/O vc+Dz4zOu86xCk5hbWVbZW5fR0JdPUtvbnNvbGUKTmFtZVtlb109S29uc29sZQpOYW1lW2VzXT1L b25zb2xlCk5hbWVbZXRdPUtvbnNvb2wKTmFtZVtldV09S29udHNvbGEKTmFtZVtmaV09S29uc29s ZQpOYW1lW2ZyXT1Lb25zb2xlCk5hbWVbZnldPUtvbnNvbGUKTmFtZVtnYV09S29uc29sZQpOYW1l W2dsXT1Lb25zb2xlCk5hbWVbZ3VdPeCqleCri+CqqOCrjeCquOCri+CqsgpOYW1lW2hlXT1Lb25z b2xlCk5hbWVbaGldPeCkleCkguCkuOCli+CksgpOYW1lW2huZV094KSV4KSC4KS44KWL4KSyCk5h bWVbaHJdPUtvbnNvbGUKTmFtZVtoc2JdPUtvbnNvbGEKTmFtZVtodV09S29uc29sZQpOYW1lW2lh XT1Lb25zb2xlCk5hbWVbaWRdPUtvbnNvbGUKTmFtZVtpc109S29uc29sZQpOYW1lW2l0XT1Lb25z b2xlCk5hbWVbamFdPUtvbnNvbGUKTmFtZVtrYV094YOZ4YOd4YOc4YOh4YOd4YOa4YOYCk5hbWVb a2tdPUtvbnNvbGUKTmFtZVtrbV094Z6A4Z674Z6E4Z6f4Z684Z6bCk5hbWVba25dPeCyleCyqOCz jeCyuOCzi+CysuCzjQpOYW1lW2tvXT1Lb25zb2xlCk5hbWVba3VdPUtvbnNvbApOYW1lW2x0XT1L b25zb2xlCk5hbWVbbHZdPUtvbnNvbGUKTmFtZVttYWldPeCkleCkguCkuOCli+CksgpOYW1lW21r XT3QmtC+0L3Qt9C+0LvQsApOYW1lW21sXT3gtJXgtKPgtY3igI3gtLjgtYvgtLPgtY3igI0KTmFt ZVttcl094KSV4KSC4KS44KWL4KSyCk5hbWVbbXNdPUtvbnNvbGUKTmFtZVtuYl09S29uc29sZQpO YW1lW25kc109S29uc29sZQpOYW1lW25lXT3gpJXgpKjgpY3gpLjgpYvgpLIKTmFtZVtubF09S29u c29sZQpOYW1lW25uXT1Lb25zb2xsCk5hbWVbb2NdPUtvbnNvbGUKTmFtZVtvcl094KyV4K2L4Kyy 4Ky44K2L4KyyCk5hbWVbcGFdPeColeCoqOCouOCpi+CosgpOYW1lW3BsXT1Lb25zb2xhCk5hbWVb cHRdPUtvbnNvbGUKTmFtZVtwdF9CUl09S29uc29sZQpOYW1lW3JvXT1Lb25zb2zEgwpOYW1lW3J1 XT1Lb25zb2xlCk5hbWVbc2VdPUtvbnNvbGxhCk5hbWVbc2ldPeC2muC2seC3iuC3g+C3neC2veC3 igpOYW1lW3NrXT1Lb25zb2xlCk5hbWVbc2xdPUtvbnNvbGUKTmFtZVtzcl090JrQvtC90LfQvtC7 0LAKTmFtZVtzckBpamVrYXZpYW5dPdCa0L7QvdC30L7Qu9CwCk5hbWVbc3JAaWpla2F2aWFubGF0 aW5dPUtvbnNvbGUKTmFtZVtzckBsYXRpbl09S29uc29sZQpOYW1lW3N2XT1Lb25zb2xlCk5hbWVb dGFdPeCuleCuvuCuqeCvjeCumuCvi+CusuCvjQpOYW1lW3RlXT3gsJXgsL7gsKjgsY3gsLjgsYvg sLLgsY0KTmFtZVt0Z1090JrQvtC90YHQvtC7Ck5hbWVbdGhdPeC4hOC4reC4meC5guC4i+C4pS1L Ck5hbWVbdHJdPUtvbnNvbGUKTmFtZVt1Z109S29uc29sZQpOYW1lW3VrXT1Lb25zb2xlCk5hbWVb dXpdPUtvbnNvbGUKTmFtZVt1ekBjeXJpbGxpY109S29uc29sZQpOYW1lW3ZpXT1Lb25zb2xlCk5h bWVbd2FdPUtvbnNvbGUKTmFtZVt4aF09S29uc29sZQpOYW1lW3gtdGVzdF09eHhLb25zb2xleHgK TmFtZVt6aF9DTl09S29uc29sZQpOYW1lW3poX1RXXT1Lb25zb2xlCgpHZW5lcmljTmFtZT1UZXJt aW5hbApHZW5lcmljTmFtZVthZl09VGVybWluYWFsCkdlbmVyaWNOYW1lW2FyXT3Yt9ix2YHZitmR 2KkKR2VuZXJpY05hbWVbYXNdPeCmn+CmvuCnsOCnjeCmruCmv+CmqOCnh+CmsgpHZW5lcmljTmFt ZVthc3RdPVRlcm1pbmFsCkdlbmVyaWNOYW1lW2JlQGxhdGluXT1UZXJtaW5hxYIKR2VuZXJpY05h bWVbYmddPdCi0LXRgNC80LjQvdCw0LsKR2VuZXJpY05hbWVbYm5dPeCmn+CmvuCmsOCnjeCmruCm v+CmqOCmvuCmsgpHZW5lcmljTmFtZVtibl9JTl094Kaf4Ka+4Kaw4KeN4Kau4Ka/4Kao4KeN4Kav 4Ka+4KayCkdlbmVyaWNOYW1lW2JzXT1UZXJtaW5hbApHZW5lcmljTmFtZVtjYV09VGVybWluYWwK R2VuZXJpY05hbWVbY2FAdmFsZW5jaWFdPVRlcm1pbmFsCkdlbmVyaWNOYW1lW2NzXT1UZXJtaW7D oWwKR2VuZXJpY05hbWVbY3NiXT1UZXJtaW5hbApHZW5lcmljTmFtZVtkYV09VGVybWluYWwKR2Vu ZXJpY05hbWVbZGVdPVRlcm1pbmFsCkdlbmVyaWNOYW1lW2VsXT3OpM61z4HOvM6xz4TOuc66z4wK R2VuZXJpY05hbWVbZW5fR0JdPVRlcm1pbmFsCkdlbmVyaWNOYW1lW2VvXT1UZXJtaW5hbG8KR2Vu ZXJpY05hbWVbZXNdPVRlcm1pbmFsCkdlbmVyaWNOYW1lW2V0XT1UZXJtaW5hbApHZW5lcmljTmFt ZVtldV09VGVybWluYWxhCkdlbmVyaWNOYW1lW2ZpXT1Qw6TDpHRlaWtrdW5hCkdlbmVyaWNOYW1l W2ZyXT1UZXJtaW5hbApHZW5lcmljTmFtZVtmeV09VGVybWluYWwKR2VuZXJpY05hbWVbZ2FdPVRl aXJtaW7DqWFsCkdlbmVyaWNOYW1lW2dsXT1UZXJtaW5hbApHZW5lcmljTmFtZVtndV094Kqf4Kqw 4KuN4Kqu4Kq/4Kqo4KqyCkdlbmVyaWNOYW1lW2hlXT3Xnteh15XXowpHZW5lcmljTmFtZVtoaV09 4KSf4KSw4KWN4KSu4KS/4KSo4KSyCkdlbmVyaWNOYW1lW2huZV094KSf4KSw4KWN4KSu4KS/4KSo 4KSyCkdlbmVyaWNOYW1lW2hyXT1UZXJtaW5hbApHZW5lcmljTmFtZVtoc2JdPVRlcm1pbmFsCkdl bmVyaWNOYW1lW2h1XT1UZXJtaW7DoWwKR2VuZXJpY05hbWVbaWFdPVRlcm1pbmFsCkdlbmVyaWNO YW1lW2lkXT1UZXJtaW5hbApHZW5lcmljTmFtZVtpc109U2tqw6FoZXJtaXIKR2VuZXJpY05hbWVb aXRdPVRlcm1pbmFsZQpHZW5lcmljTmFtZVtqYV0944K/44O844Of44OK44OrCkdlbmVyaWNOYW1l W2thXT3hg6Lhg5Thg6Dhg5vhg5jhg5zhg5Dhg5rhg5gKR2VuZXJpY05hbWVba2tdPdCi0LXRgNC8 0LjQvdCw0LsKR2VuZXJpY05hbWVba21dPeGen+GfkuGekOGetuGek+GeuOGemQpHZW5lcmljTmFt ZVtrbl094LKG4LKm4LOH4LK24LKk4LOG4LKw4LOGICjgsp/gsrDgs43gsq7gsr/gsqjgsrLgs40p CkdlbmVyaWNOYW1lW2tvXT3thLDrr7jrhJAKR2VuZXJpY05hbWVba3VdPVRlcm3Drm5hbApHZW5l cmljTmFtZVtsdF09VGVybWluYWxhcwpHZW5lcmljTmFtZVtsdl09VGVybWluxIFsaXMKR2VuZXJp Y05hbWVbbWFpXT3gpJ/gpLDgpY3gpK7gpL/gpKjgpLIKR2VuZXJpY05hbWVbbWtdPdCi0LXRgNC8 0LjQvdCw0LsKR2VuZXJpY05hbWVbbWxdPeC0n+C1huC0sOC1jeKAjeC0ruC0v+C0qOC0suC1jeKA jQpHZW5lcmljTmFtZVttcl094KSf4KSw4KWN4KSu4KS/4KSo4KSyCkdlbmVyaWNOYW1lW25iXT1U ZXJtaW5hbApHZW5lcmljTmFtZVtuZHNdPUtvbnNvb2wKR2VuZXJpY05hbWVbbmxdPVRlcm1pbmFs CkdlbmVyaWNOYW1lW25uXT1UZXJtaW5hbApHZW5lcmljTmFtZVtvcl094Kyf4Kyw4K2N4Kyu4Ky/ 4Kyo4Ky+4KyyCkdlbmVyaWNOYW1lW3BhXT3gqJ/gqLDgqK7gqYDgqKjgqLIKR2VuZXJpY05hbWVb cGxdPVRlcm1pbmFsCkdlbmVyaWNOYW1lW3B0XT1UZXJtaW5hbApHZW5lcmljTmFtZVtwdF9CUl09 VGVybWluYWwKR2VuZXJpY05hbWVbcm9dPVRlcm1pbmFsCkdlbmVyaWNOYW1lW3J1XT3QotC10YDQ vNC40L3QsNC7CkdlbmVyaWNOYW1lW3NlXT1UZXJtaW5hbApHZW5lcmljTmFtZVtzaV094LaF4Lac 4LeK4oCN4La74La6CkdlbmVyaWNOYW1lW3NrXT1UZXJtaW7DoWwKR2VuZXJpY05hbWVbc2xdPVRl cm1pbmFsCkdlbmVyaWNOYW1lW3NyXT3QotC10YDQvNC40L3QsNC7CkdlbmVyaWNOYW1lW3NyQGlq ZWthdmlhbl090KLQtdGA0LzQuNC90LDQuwpHZW5lcmljTmFtZVtzckBpamVrYXZpYW5sYXRpbl09 VGVybWluYWwKR2VuZXJpY05hbWVbc3JAbGF0aW5dPVRlcm1pbmFsCkdlbmVyaWNOYW1lW3N2XT1U ZXJtaW5hbApHZW5lcmljTmFtZVt0YV094K6u4K+B4K6p4K+I4K6v4K6u4K+NCkdlbmVyaWNOYW1l W3RlXT3gsJ/gsYbgsLDgsY3gsK7gsL/gsKjgsLLgsY0KR2VuZXJpY05hbWVbdGddPdCi0LXRgNC8 0LjQvdCw0LsKR2VuZXJpY05hbWVbdGhdPeC5gOC4l+C4reC4o+C5jOC4oeC4tOC4meC4seC4pQpH ZW5lcmljTmFtZVt0cl09VcOnYmlyaW0KR2VuZXJpY05hbWVbdWddPdiq25DYsdmF2YnZhtin2YQK R2VuZXJpY05hbWVbdWtdPdCi0LXRgNC80ZbQvdCw0LsKR2VuZXJpY05hbWVbdXpdPVRlcm1pbmFs CkdlbmVyaWNOYW1lW3V6QGN5cmlsbGljXT3QotC10YDQvNC40L3QsNC7CkdlbmVyaWNOYW1lW3dh XT1UZXJtaW7DpQpHZW5lcmljTmFtZVt4LXRlc3RdPXh4VGVybWluYWx4eApHZW5lcmljTmFtZVt6 aF9DTl0957uI56uvCkdlbmVyaWNOYW1lW3poX1RXXT3ntYLnq6/mqZ8K --nextPart1761258.6yknDyUaQs--