网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
11月30日漏签0天
python吧 关注:479,765贴子:1,980,430
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 23回复贴,共1页
<<返回python吧
>0< 加载中...

python字典问题求助

  • 只看楼主
  • 收藏

  • 回复
  • great571
  • 童生
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
RT,我想把我的一些数据先从文件中读取,然后用字典储存起来,而字典里的值又是一个列表。
举例子,我的txt文档里面的内容是a,(b,c); b,(c,d); c,(d,e); d,(e,a); e,(a,b)
我想要我的字典的情况是{‘a': ['b','c'], 'b': ['c','d'], 'c': ['d','e'], 'd': ['e','a'], 'e': ['a','b']}
求高手指点迷津


  • great571
  • 童生
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
自顶求大神


2025-11-30 05:09:42
广告
不感兴趣
开通SVIP免广告
  • 轻轻地走过123
  • 贡士
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
考虑一下split()函数,还有就是字符串可以像列表一样切片的,’1234‘[:3] >>>'123'


  • 轻轻地走过123
  • 贡士
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
要是你的数据格式特别整齐,就是你放的那个样子,我倒是有个好方法,
读取文件之后字符串放入s中,用string.replace(old,new)将"(" ")" ";" 都替换成逗号
然后再使用split(",'), 然后写循环,每三个数放在一组就好了...


  • nadesico19
  • 榜眼
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
数据不规则的话比较难解析,不过如果你的数据满足以下形式,倒是可以教你个讨巧的方法:
[ 形式 ]
key1, (val1_1, val1_2, ...); key2, (val2_1, val2_2, ...); ...


  • nadesico19
  • 榜眼
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
那简单说一下。。。6L主要利用字典的dict(iterable)创建方式,这种方式必须保证迭代元素是键值对,因此先回答以下两个问题。
----------------------------
我注意到你代码里面的形式是每个键后面的值的数量递增了1,你说的这个要满足这种形式么~
>> 只要满足键名不重复即可,键名重复虽不会报错,但会让你头疼。
还是只要键后面的值用括号括起来了就行了?
>> 后面的值只能有一个,不然就不是键值“对”了
----------------------------
继续回到6L代码,这种方式利用一个事实,"key, value"字符串通过eval求值可以得到(key, value)元祖。但是这里有两个问题:
1. 我们需要的是('key', 'value')。
2. eval对key或value求值时,命名空间内没有相应名字存在时会发生NameError。
继续话题前,请首先保证你对命名空间和LEGB法则有正确理解。
6L的seval就是在NameError发生时,在函数作用域内用exec执行key='key',让对key求值可以从函数命名空间内得到'key'。当然,这个seval有以下注意点以及缺陷。
1. seval用函数属性来做返回值是为了不添加局部变量污染命名空间。
2. seval尽量放在单独一个模块(文件)内,以减少模块顶层名字的干扰。
3. 如果求值字符串内有内置名字(模块内置、list、set等)时,此方法不适用。
大致就是这些,继续搬砖去了


  • 贴吧用户_079EVtt
  • 进士
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
6L方法很好,但太trick了,这里有文本解析的正规优雅的方法,用到pyparsing库。可能要另外安装,一些科学计算版本是自带的。
from pyparsing import *
inf=Word(nums+alphas) #这里假设内容是字母和数字组成的,不满足可以继续加,中文也行
value='('+delimitedList(inf)+')'
pair=inf+','+value
doc=delimitedList(pair,delim=';')
value.setParseAction(lambda tokens:[tokens[1:-1]])
pair.setParseAction(lambda tokens:(tokens[0],tokens[2]))
text='a,(b,c); b,(c,d); c,(d,e); d,(e,a); e,(a,b)'
r=dict(doc.parseString(text).asList())
print r
'''
{'a': ['b', 'c'],
'b': ['c', 'd'],
'c': ['d', 'e'],
'd': ['e', 'a'],
'e': ['a', 'b']}
'''


  • 江湖程序员(大号)
  • 状元
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


2025-11-30 05:03:42
广告
不感兴趣
开通SVIP免广告
  • 电离的Tesla
  • 探花
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
楼上的写法都很高级,我来说一下比较一般的写法
d={}
for x in txt.split(';'):
••••key,value=x.replace(' ','').split(',(')
••••value=value[:-1].split(',')
••••dict[ke


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 23回复贴,共1页
<<返回python吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示