我有列表的字符串值,代表某些用户的id.age
:
users = ["1.20", "2.35", "3", "4", "5.", "6.30", "7."]
如何正确拆分以分别获取id
和age
?
请注意,我们有一些数据缺少age
信息(例如"3"
和"4"
),更糟糕的是,我们只有id
和一个点(例如"5."
和"7."
)。
当然我可以使用分割功能,例如:
>>> "1.2".split('.')
['1', '2']
>>> "2".split('.')
['2']
>>> "3.".split('.')
['3', '']
但是,我需要检查每个结果。也许,这样的事情:
res = "3.".split('.')
id = int(res[0])
if len(res) > 1:
if res[1] != "":
age = int(res[1])
另一种选择是使用rpartition
函数,例如:
>>> "1.2".rpartition('.')
('1', '.', '2')
>>> "2".rpartition('.')
('', '', '2')
>>> "3.".rpartition('.')
('3', '.', '')
但我仍然需要“手动”检查结果,在第二个示例中,应该是id
的值位于age
位置。 (例如('', '', '2')
)。
是否有内置函数可以得到这样的结果?
>>> "1.2".some_split_function('.')
('1', '.', '2')
>>> "2".some_split_function('.')
('2', None, None)
>>> "3.".some_split_function('.')
('3', '.', None)
所以我可以在这样的循环中调用它:
for user_info in users:
id, _, age = user_info.some_split_function('.')
print int(id)
if age is not None:
print int(age)
答案 0 :(得分:2)
是的,您只需使用partition
代替rpartition
。
for user_info in users:
id, _, age = user_info.partition('.')
if age.isdigit():
print int(age)
您需要将该条件从None
更改为仅检查您是否适当地提取了一个数字。这将处理空字符串等...
一般而言,避免此问题的方法是首先不要像这样构建数据。
看到其他一些答案,没有理由做任何这么复杂的事情。如果你想要一个将id映射到年龄的功能解决方案,那么我会提倡这样的事情:
>>> {id: age or None for id, _, age in [user.partition(".") for user in users]}
{'1': '20', '3': None, '2': '35', '5': None, '4': None, '7': None, '6': '30'}
答案 1 :(得分:0)
请尝试以下操作,我们只会在u
包含.
时进行拆分,如果不包含u
,则None
为ID {1}}。
users = ["1.20", "2.35", "3", "4", "5.", "6.30", "7."]
data = []
for u in users:
id, age = u.split('.') if '.' in u else [u, None]
age = None if age == '' else age
data.append({id: age})
如果您希望自己的ID为整数,只需在int()
上调用id
函数,如下所示:
data.append({int(id): age})
<强>输出:强>
>>> data
[{'1': '20'}, {'2': '35'}, {'3': None}, {'4': None}, {'5': None}, {'6': '30'}, {'7': None}]