Shyam Parimal Katti wrote: > Hello, > > I have a list of sql queries, some which are split across multiple list > elements e.x. > ['drop table sample_table;', 'create table sample_test', '(col1 int);', > 'select col1 from', ' sample_test;'] > > A semi-colon in the string value indicates the termination of a sql > query. So the expected out come is a conversion to a list of valid sql > queries: > ['drop table sample_table;', 'create table sample_test (col1 int);', > 'select col1 from sample_test;'] > > Here is the code that does that: > > sample = ['drop table sample_table;', 'create table sample_test', '(col1 > int);', 'select col1 from', ' sample_test;'] > pure_sqls = [] > query_holder= '' > for each_line in sample: > query_holder += each_line > if query_holder.endswith(';'): > pure_sqls.append(query_holder) > query_holder = '' > > > Is there a way to do this by eliminating explicit creation of new > list(pure_sqls) and a temporary variable(query_holder)? Using list > comprehension? Though I don't want to put the shorter version in > production(if it is difficult to understand), I am looking if this can be > done with list comprehension since I am trying to learn list comprehension > by using it in such scenarios.
Yours is the sane approach, but it may be fun to try to understand the following evil hacks ;) >>> [sql.replace("\0", " ") + ";" for sql in "\0".join(sample + [""]).split(";\0") if sql] ['drop table sample_table;', 'create table sample_test (col1 int);', 'select col1 from sample_test;'] >>> from itertools import groupby >>> def key(x, group=[0]): ... try: ... return group[0] ... finally: ... group[0] += x.endswith(";") ... >>> [" ".join(group) for _, group in groupby(sample, key)] ['drop table sample_table;', 'create table sample_test (col1 int);', 'select col1 from sample_test;'] -- https://mail.python.org/mailman/listinfo/python-list