Thi*_*ode 4 python mysql dictionary list
手头的问题:
我有以下列表的元组(ID,国家),我将最终存储在MySQL表中.
mylist = [(10, 'Other'), (10, 'India'), (10, 'Unknown'), (11, 'Other'), (11, 'Unknown'), (12, 'USA'), (12, 'UK'), (12, 'Other')]
Run Code Online (Sandbox Code Playgroud)
我想使用以下条件处理'其他'和'未知':
Value Replaced by => This value
----------------------------------------
Other & Unknown => Other
A country & Other => Country
A country & Unknown => Country
Run Code Online (Sandbox Code Playgroud)
Python:
def refinelist(mylist):
'''Updating the list to remove unwanted values'''
'''
Other & Unknown => Other
A country & Other => Country
A country & Unknown => Country
'''
if 'Other' in mylist and 'Unknown' in mylist:
print 'remove unknown'
mylist.remove('Unknown')
if 'Other' in mylist and len(mylist) >= 2:
print 'remove other'
mylist.remove('Other')
if 'Unknown' in mylist and len(mylist) >= 2:
print 'remove unknown'
mylist.remove('Unknown')
return mylist
def main():
mylist = [(10, 'Other'), (10, 'India'), (10, 'Unknown'), (11, 'Other'), (11, 'Unknown'), (12, 'USA'), (12, 'UK'), (12, 'Other')]
d = {}
for x,y in mylist:
d.setdefault(x, []).append(y)
# Clean the list values
for each in d:
d[each] = refinelist(d[each])
## Convert dict to list of tuples for database entry
outlist = []
#result = [(key, value) for key,value in d.keys(), value in d.values()] ## Couldn't get this to work. Can the below loop be written as list comprehension with minimal footprint?
for key, value in d.items():
if len(value) == 1:
print key, value[0]
outlist.append((key, value[0]))
elif len(value) > 1:
for eachval in value:
print key, eachval
outlist.append((key, eachval))
print outlist
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
输出:
remove unknown
remove other
remove unknown
remove other
10 India
11 Other
12 USA
12 UK
[(10, 'India'), (11, 'Other'), (12, 'USA'), (12, 'UK')]
Run Code Online (Sandbox Code Playgroud)
题 :
我觉得这可以更有效地完成.使用dict overkill?
我从一个元组(luples)列表开始,将它转换为dict,执行一个干净的操作,然后将其转换回luples?
我可以在MySQL表中插入原始的luples,然后用很少的查询来处理'Unknown'和'Other',但我更喜欢Python来完成任务.
非常感谢pythonic解决方案或代码的一些批评者.
广泛使用生成器和列表理解,你可以像这样写:
other = ['Other', 'Unknown'] # Strings denoting non-contries
ids = set(i for i,j in mylist) # All ids in the list
known = set(i for i,j in mylist if j not in other) # Ids of real countries
outlist = [k for k in mylist if k[1] not in other] # Keep all real countries
outlist.extend((i, other[0]) for i in ids - known) # Append "Other" for all IDs with no real country
Run Code Online (Sandbox Code Playgroud)
结果将是
[(10, 'India'), (12, 'USA'), (12, 'UK'), (11, 'Other')]
Run Code Online (Sandbox Code Playgroud)
如果订单很重要,这将意味着更多的工作.