从字典</key,>中的<key,value =“”>加入值(列表)

时间:2013-06-06 20:23:28

标签: python python-2.7

我有格式{'string-value-keys':[list-values]}的字典。对于特定的键值,我想将该值作为字符串检索。这是一个例子:

>>> simpleDict= {'DDL_TABLE1':['create table bla', ' columns bla bla'], 'DML_TABLE1': ['insert into bla', ' values bla']}
>>> simpleDict
{'DDL_TABLE1': ['create table bla', ' columns bla bla'], 'DML_TABLE1': ['insert into bla', ' values bla']}
>>> sqlQry= " ".join(value for key, value in simpleDict.items() if 'DDL' in key)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected string, list found
>>> sqlQry= " ".join(value for key, value in simpleDict.items() if 'DDL' in key)

当值是字符串值列表时,我无法理解为什么会出现此错误。

3 个答案:

答案 0 :(得分:5)

将连接移到内部:

(' '.join(value) for key, value in simpleDict.items() if 'DDL' in key)

测试:

>>> simpleDict= {'DDL_TABLE1':['create table bla', ' columns bla bla'], 'DML_TABLE1': ['insert into bla', ' values bla']}
>>> list(' '.join(value) for key, value in simpleDict.items() if 'DDL' in key)
['create table bla  columns bla bla']

根据评论进行修改

使用列表推导与生成器相比,这更容易看到。

你的原作为LC:

>>> [value for key, value in simpleDict.items() if 'DDL' in key]
[['create table bla', ' columns bla bla']]

这是创建字符串列表的列表。如果您尝试使用联接:

>>> ' '.join([value for key, value in simpleDict.items() if 'DDL' in key])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected string, list found

产生你看到的错误。

好的,根据您的完整数据的样子,您可以进行两次连接:

>>> ' '.join([' '.join(value) for key, value in simpleDict.items() if 'DDL' in key])

如果您只想要一个大字符串,则多个连接不是世界末日。

如果您只想找一个项目,可以这样做:

>>> [' '.join(value) for key, value in simpleDict.items() if 'DDL' in key][0]
'create table bla  columns bla bla'

如果您正在处理数据/多次使用中的多次点击,请使用循环:

for s in [' '.join(value) for key, value in simpleDict.items() if 'DDL' in key]:
   # s multiple times

如果数据是“大海捞针”类型,请使用循环并在找到所需内容后突破。

答案 1 :(得分:2)

" ".join()需要一个可迭代的字符串,而您的生成器会生成字符串列表,因此最终会调用" ".join([['create table bla', ' columns bla bla']])这样的调用。

由于看起来您只希望匹配一个密钥,因此您可能不希望使用生成器。我建议如下:

sqlQry = None
for key, value in simpleDict.items():
    if 'DDL' in key:
        sqlQry = " ".join(value)
        break

答案 2 :(得分:1)

也许你想加入价值的结果:

In [11]: sqlQry= " ".join(''.join(value) for key, value in simpleDict.items() if 'DDL' in key)

In [12]: sqlQry
Out[12]: 'create table bla columns bla bla'

目前您正在尝试加入列表列表..

In [13]: ''.join([['a','b']])
TypeError                                 Traceback (most recent call last)
<ipython-input-13-7289bd6c8196> in <module>()
----> 1 ''.join([['a','b']])

TypeError: sequence item 0: expected string, list found