python - 修改代码以处理一长串字符串
问题描述
我想为一项任务准备一长串数据。我已经能够将在单个实例上完成任务的代码放在一起,但现在我想让它通过一个列表运行。以下是我尝试过的。
用于测试的单个实例......
sentences = ['if the stimulus bill had become hamstrung by a filibuster threat or recalcitrant conservadems']
antecedents = ['bill had become hamstrung by']
实际用例是 pandas 数据框中的两列,我已将其转换为列表
f = tra_df['sentence'].tolist()
b = tra_df['antecedent'].tolist()
单个用例的代码....
results =[]
ous = 1
ayx = ' '.join([str(elem) for elem in antecedents])
ayxx = ayx.split(" ")
antlabels = []
for i in range(len(ayxx)):
antlabels.append(ous)
lab = ' '.join([str(elem) for elem in antlabels])
# Build the regex string required
rx = '({})'.format('|'.join(re.escape(el) for el in antecedents))
# Generator to yield replaced sentences
it = (re.sub(rx, lab, sentence) for sentence in sentences)
# Build list of paired new sentences and old to filter out where not the same
results = ([new_sentence for old_sentence, new_sentence in zip(sentences, it) if old_sentence != new_sentence])
# replace other non 1 values with 0
nw_results = ' '.join([str(elem) for elem in results])
ew_results= nw_results.split(" ")
new_results = ['0' if i is not '1' else i for i in ew_results]
labels =([int(e) for e in new_results])
labels
这就是我得到的结果
[0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0]
大列表的稍微修改的代码
for sentences, antecedents in zip(f, b):
gobels = []
#def format_labels(antecedents,sentences):
results =[]
#lab =[]
ous = 1
ayx = ' '.join([str(elem) for elem in antecedents])
ayxx = ayx.split(" ")
antlabels = []
for i in range(len(ayxx)):
antlabels.append(ous)
lab = ' '.join([str(elem) for elem in antlabels])
# Build the regex string required
rx = '({})'.format('|'.join(re.escape(el)for el in antecedents))
# Generator to yield replaced sentences
it = (re.sub(rx, lab, sentence)for sentence in sentences)
# Build list of paired new sentences and old to filter out where not the same
results = ([new_sentence for old_sentence, new_sentence in zip(sentences, it) if old_sentence != new_sentence])
nw_results = ' '.join([str(elem) for elem in results])
ew_results= nw_results.split(" ")
new_results = ['0' if i is not '1' else i for i in ew_results]
labels =([int(e) for e in new_results])
t2 = time.time()
gobels.append(labels)
现在,我得到一个只有 1 的长列表,而不是包含 0 和 1 的字符串列表......
有什么问题?
[[1,
1,
1,
1,
1,
1,
1,
1,
1,
........]
解决方案
像这样的东西可能会更好地扩展。可能还有一种更 Pythonic 的方式来执行此操作。
a = '1 2 3 4 5'
b = '3 4 6'
a = a.split()
b = b.split()
for idx, val in enumerate(b):
try:
a[a.index(val)] = True
except ValueError:
pass
for idx, val in enumerate(a):
if val is not True:
a[idx] = False
print([1.0 if i else 0.0 for i in a])
# [0.0, 0.0, 1.0, 1.0, 0.0]
推荐阅读
- 3d - 如何在 OpenSCAD 中放置对象(使其在 Z 轴上齐平以进行 3D 打印)
- c++ - 如何在 C++ 中将摩尔斯电码翻译成英语?
- reactjs - React-query:如何更新缓存?
- django - 如何在管理员(Django)中从服务器选择(不上传)文件
- axios - 在 Nuxt.js 中带有正文的 axios DELETE 请求
- php - 如何修复 Laravel 8 测试中的“419 - 页面已过期”错误?
- apache-spark - pyspark:如何以“yyyy-MM-dd HH”格式按日期列分区
- php - Laravel 应用程序与 3rd 方 API 交互以获取令牌
- wpf - ListViewItem 中的 EventTriggers 不应由包含的 ItemTemplate 触发
- python - 在没有实际表单的情况下使用 flask-wtf 表单验证