严重的是,这似乎很容易,但是到目前为止,我发现的任何方法都没有奏效。
我有一个像这样的字典对象:
PHP_ARG_ENABLE([test2],
[whether to enable test2 support],
[AS_HELP_STRING([--enable-test2],
[Enable test2 support])],
[no])
if test "$PHP_TEST2" != "no"; then
AC_DEFINE(HAVE_TEST2, 1, [ Have test2 support ])
PHP_NEW_EXTENSION(test2, test2.c, $ext_shared)
fi
但是我需要这样:
dict = {' key1 ': [" value1 ", " value1_1 "], ' key2 ': ' value2 ', ' key3 ': [' value3 ', ' value3_1 '], ' key4 ': ' value4 ', ' key5 ': [' value5 ', ' value5_1 ', ' value5_2 ']}
因为有些值是列表,所以我尝试了这样的for循环(请使用有趣的语法,我现在只需要使其工作即可,以后将改进语法):
{'key1': ["value1", "value1_1"], 'key2': 'value2', 'key3': ['value3', 'value3_1'], 'key4': 'value4', 'key5': ['value5', 'value5_1', 'value5_2']
那没有用。然后我尝试了:
for k, v in dict.items():
if type(v) is list:
k.replace(' ','')
k.replace(" ","")
for i in v:
i.replace(' ','')
i.replace(" ","")
else:
k.replace(' ','')
k.replace(" ","")
i.replace(' ','')
i.replace(" ","")
那也没做。帮助!!!
答案 0 :(得分:3)
使用 dict理解,列表理解和strip()
并用单行代码进行尝试:
{k.strip():[s.strip() for s in v] if type(v) is list else v.strip() for k, v in d.items()}
返回:
{'key1': ['value1', 'value1_1'],
'key2': 'value2',
'key3': ['value3', 'value3_1'],
'key4': 'value4',
'key5': ['value5', 'value5_1', 'value5_2']}
这绝对是最pythonic的方式:-)
答案 1 :(得分:1)
如果您想使用字典理解:
{key.strip():[x.strip() for x in value] if type(value) == list else value.strip() for key, value in dict.items()}
答案 2 :(得分:1)
str.strip
完全可以满足您的需求。我建议创建一种简单的方法来删除前导/后缀空格,并使用非常简单的dict理解( PS :不要将内建函数用作变量名!我将dict
替换为以下data
供参考):
data = {' key1 ': [" value1 ", " value1_1 "], ' key2 ': ' value2 ', ' key3 ': [' value3 ', ' value3_1 '], ' key4 ': ' value4 ', ' key5 ': [' value5 ', ' value5_1 ', ' value5_2 ']}
def ostrip(o):
try: return o.strip()
except: return list(map(str.strip, o))
print({ostrip(k): ostrip(v) for k, v in data.items()})
在ostrip
上方只是尝试将其剥离,就好像它是一个字符串一样,否则通过将方法映射到列表来假定它是一个字符串列表。您可以使用else
语句来捕获极端情况,尽管这取决于您。
这将导致如下结果:
{'key1': ['value1', 'value1_1'], 'key2': 'value2', 'key3': ['value3', 'value3_1'], 'key4': 'value4', 'key5': ['value5', 'value5_1', 'value5_2']}
答案 3 :(得分:0)
看似简单,并且替换了所有空格,但是:
user.name='new name'
它将对象转换为文本,因此可以同时删除空格,而无需遍历
答案 4 :(得分:0)
您的方法几乎是正确的,但是由于您从循环中调用了k,v个变量,因此必须更新字典。
dict_spaceless = dict()
for k, v in dict.items():
if type(v) is list:
k = k.strip()
v_spaceless = list()
for i in v:
i = i.strip()
v_spaceless.append(i)
else:
k = k.strip()
v_spaceless = v.strip()
dict_spaceless[k]= v_spaceless
dict=dict_spaceless
此外,一个好的建议是不要通过其初始化方法来调用变量。也就是说,在快速读取代码时使用名为“ dict”的字典会非常混乱,因为在python中初始化一个空字典,我们将函数称为dict()
答案 5 :(得分:-1)
您需要遍历dict
的值以查看它们是列表还是字符串-然后在每个字符串或列表值上使用rstrip()
和lstrip()
-和每个键。这些函数删除了字符串中的左/右空格-strip()
也可以使用,它结合了rstrip / lstrip。我只是创建一个新字典来保存这些字典。
dict = {' key1 ': [" value1 ", " value1_1 "], ' key2 ': ' value2 ', ' key3 ': [' value3 ', ' value3_1 '], ' key4 ': ' value4 ', ' key5 ': [' value5 ', ' value5_1 ', ' value5_2 ']}
new_dict = {}
for i in dict.keys():
if type(dict[i]) is list:
new_dict[i.rstrip().lstrip()] = [j.rstrip().lstrip() for j in dict[i]]
else:
new_dict[i.rstrip().lstrip()] = dict[i].rstrip().lstrip()
print(new_dict)
# {'key1': ['value1', 'value1_1'], 'key2': 'value2', 'key3': ['value3', 'value3_1'], 'key4': 'value4', 'key5': ['value5', 'value5_1', 'value5_2']}