我正在尝试从列表和元组元组创建字典,如下所示。我必须将元组反向映射到列表并创建一组非None列名。
非常感谢任何关于pythonic方式实现解决方案的建议(所需词典)。
MySQL表'StateLog':
Name NY TX NJ
Amy 1 None 1
Kat None 1 1
Leo None None 1
Python代码:
## Fetching data from MySQL table
#cursor.execute("select * from statelog")
#mydataset = cursor.fetchall()
## Fetching column names for mapping
#state_cols = [fieldname[0] for fieldname in cursor.description]
state_cols = ['Name', 'NY', 'TX', 'NJ']
mydataset = (('Amy', '1', None, '1'), ('Kat', None, '1', '1'), ('Leo', None, None, '1'))
temp = [zip(state_cols, each) for each in mydataset]
# Looks like I can't do a tuple comprehension for the following snippet : finallist = ((eachone[1], eachone[0]) for each in temp for eachone in each if eachone[1] if eachone[0] == 'Name')
for each in temp:
for eachone in each:
if eachone[1]:
if eachone[0] == 'Name':
k = eachone[1]
print k, eachone[0]
print '''How do I get a dictionary in this format'''
print '''name_state = {"Amy": set(["NY", "NJ"]),
"Kat": set(["TX", "NJ"]),
"Leo": set(["NJ"])}'''
到目前为止的输出:
Amy Name
Amy NY
Amy NJ
Kat Name
Kat TX
Kat NJ
Leo Name
Leo NJ
所需词典:
name_state = {"Amy": set(["NY", "NJ"]),
"Kat": set(["TX", "NJ"]),
"Leo": set(["NJ"])}
答案 0 :(得分:1)
看起来像defaultdict的另一份工作!
所以我们创建我们的默认字典
name_state = collections.defaultdict(set)
我们现在有一个字典设置为所有默认值,我们现在可以做这样的事情
name_state['Amy'].add('NY')
继续前进你只需要迭代你的对象并为每个名称添加正确的状态。享受
答案 1 :(得分:1)
您可以将其作为字典理解(Python 2.7 +):
from itertools import compress
name_state = {data[0]: set(compress(state_cols[1:], data[1:])) for data in mydataset}
或作为生成器表达式:
name_state = dict((data[0], set(compress(state_cols[1:], data[1:]))) for data in mydataset)
答案 2 :(得分:1)
说实话,我会说你的问题是你的代码变得太麻烦了。抵制“一线”的诱惑,创造一种功能。一切都会变得更容易!
mydataset = (
('Amy', '1', None, '1'),
('Kat', None, '1', '1'),
('Leo', None, None, '1')
)
def states(cols, data):
"""
This function receives one of the tuples with data and returns a pair
where the first element is the name from the tuple, and the second
element is a set with all matched states. Well, at least *I* think
it is more readable :)
"""
name = data[0]
states = set(state for state, value in zip(cols, data) if value == '1')
return name, states
pairs = (states(state_cols, data) for data in mydataset)
# Since dicts can receive an iterator which yields pairs where the first one
# will become a key and the second one will become the value, I just pass
# a list with all pairs to the dict constructor.
print dict(pairs)
结果是:
{'Amy': set(['NY', 'NJ']), 'Leo': set(['NJ']), 'Kat': set(['NJ', 'TX'])}