Python:数组元组提取

Python:数组元组提取,python,Python,像这样,它将有许多元组,我如何才能只提取uid,以便在结果数组中使用alex、beth和任何其他uid 我能行 results=[('uid=alex,class=zenth',{'age':['12'],'uidnumber':['12AC']}),('uid=beth,class=nenth',{'age':['22'],'uidnumber':['13SD']})] 有更好的方法吗?您可以使用该模块: 输出: import re results=[('uid=alex,class=ze

像这样,它将有许多元组,我如何才能只提取uid,以便在结果数组中使用alex、beth和任何其他uid

我能行

results=[('uid=alex,class=zenth',{'age':['12'],'uidnumber':['12AC']}),('uid=beth,class=nenth',{'age':['22'],'uidnumber':['13SD']})]
有更好的方法吗?

您可以使用该模块:

输出:

import re

results=[('uid=alex,class=zenth',{'age':['12'],'uidnumber':['12AC']}),('uid=beth,class=nenth',{'age':['22'],'uidnumber':['13SD']})]

uid_val_list=[]
for _,val in enumerate(results):
    result = re.search("uid=(.*),",val[0])
    uid_val_list.append(result.group(1))
使用命令re.search可以扫描字符串并返回所需的部分。在本例中,它正在扫描uid=.*,这意味着:

在字符串“uid=”和字符串“,”之间查找字符串

正好是你要找的名字


注意:您当前的方法没有任何“错误”。

您可以使用ast.literal\u eval将元组中的字符串转换为dict:

然后,您可以轻松访问dict值

ast.literal_eval('uid=alex,class=zenth')
{'uid': 'alex', 'class': 'zenth'}
尝试:

在搜索速度加快之前进行编译。 除了列表理解之外,如果您愿意,还可以使用map。
您可以使用简单的短列表理解:

import re

results = [('uid=alex,class=zenth', {'age': ['12'], 'uidnumber': ['12AC']}), ('uid=beth,class=nenth', {'age': ['22'], 'uidnumber': ['13SD']})]

c = re.compile('uid=(?P<uid>.+?),')

uid_val_list = [c.search(result[0]).group('uid') for result in results]
print(uid_val_list)

但是我可以说,使用re可以使代码更加优化,因为结果可以有许多元组,然后创建两个列表几乎没有优化?@user3089927如果您使用@flycee建议的re.compile方法,那么是的,使用re可以使代码比您当前的方法快26.46969%——我对其进行了计时,从而使其成为更好的方法。我们讨论的是毫秒差。另外,由于您使用的是元组,因此如果不创建新的列表/字典,您将无法获得所需的内容,因为元组是不可变的。如果uid“”中有更多字段,那么如果['uid=alex,class=zenth,item=22333,numid=1a@23“,{……}]和rest可以是相同的..我认为用这个方法,上面的解决方案是行不通的。因为我尝试了实际的结果集,它返回:“alex,class=zenth,item=22333,numid=1a@23'我尝试过执行result=re.searchr\w+,\b,val[0],它可以达到我想的目的,但不是很整洁,在结尾处添加','我修改了代码,现在应该可以正常工作了。添加在正则表达式字符串的末尾,为了使其不可用,您可以稍微解释一下正则表达式吗?成功了,谢谢。当然。正则表达式字符串“uid=?P.+?”表示尝试匹配字符串,如“uid=xxx”,xxx可以是任何字符串,使用“+?”,表示匹配多个单词,并将其取消冻结。部件“?P”是组匹配,稍后将返回。有关正则表达式的详细信息,请参见
ast.literal_eval('uid=alex,class=zenth')
{'uid': 'alex', 'class': 'zenth'}
string_list = [i[0] for i in results]
uid_class_dict = [ast.literal_eval(string) for string in string_list]
uids = [uid_class.uid for uid_class in uid_class_dict ]
import re

results = [('uid=alex,class=zenth', {'age': ['12'], 'uidnumber': ['12AC']}), ('uid=beth,class=nenth', {'age': ['22'], 'uidnumber': ['13SD']})]

c = re.compile('uid=(?P<uid>.+?),')

uid_val_list = [c.search(result[0]).group('uid') for result in results]
print(uid_val_list)
item.split(',')[0].split('=')[-1] for item in results
>>> [item[0].split(',')[0].split('=')[-1] for item in results]
['alex', 'beth']
>>>