让它工作有点麻烦。如果问题格式不正确(或问题是愚蠢的简单),请道歉。新手Python程序员:P
这是我正在尝试做的事情:
Step 1: Identify lists of strings matching criteria
Step 2: Append specific string from lists to a new list
Step 3: Do step 2 a number of times equal to an integer in a separate list
我知道,有点混乱。希望我的代码能够更好地解释它:
# Create Lists
trial_length = [2570, 2573, 2575, 2565, 2569, 2499, 2565, 2559, 2563, 2491,
2574, 2560, 2566, 2572, 2567, 2507, 2571, 2560, 2573, 2570]
condition = []
# Access file that I'm parsing
foo = open('test.asc','rw+')
for line in foo:
# Turn lines of file into individual lists
new_line = line.split()
# Select relevant lines
if len(new_line)==6:
if new_line[4]=='TEST':
# Append new_line to "condition" a number of times
# equal to integer in "trial_length"
for n in trial_length:
for t in range(0,n):
condition.append(new_line)
当然,我现在意识到这是不正确的。例如,对于“trial_length”中的第一个数字,它将new_line附加到“条件”2570次,然后重复该过程20次。我认为这只是我编码逻辑中的一个错误。我在这里缺少什么?
编辑:
应该早点发布。我期望的最终结果是“TEST”附加到“条件”2570次+ 2573次+ ...等。使用此当前代码,它将被追加1,022,980次,这是“trial_length”* 20中数字的总和。
我这样做的原因是我使用的实际文件是由实验结果组成的。该实验有20个试验,每个试验在两个条件之一下运行:“全等”或“不一致”。每个试验运行不同的长度(例如2570秒,2573秒等)。对于试验中的每一行,我想在单独的列中附加正确的条件。因此,我正在创建一个列表,其中包含正确数量和顺序的字符串“Congruent”和“Incongruent”。
简而言之,我的列表看起来像这样:
condition = ['Congruent' * 2570 times, 'Incongruent' * 2573 times,
'Incongruent' * 2575 times,...etc.].
我之前没有提到的原因是我想将问题简化为我认为最简单的形式,即将字符串附加到列表中的次数等于单独列表中的整数。
编辑2:
为了响应2rs2rt,我的输入文件是一个ASCII / ASCE文件,它基本上只是字符串行。例如,斜体和粗体是我要定位的一条线:
EFIX R 718603 719256 654 285.0 370.0 1105
719257 288.6 370.8 1064.0 ...
END 719258 SAMPLES EVENTS RES 29.38 28.94
INPUT 719259 127
***MSG 719276 !V TRIAL_VAR CONGRUENT 331***
MSG 719277 !V TRIAL_VAR direction 20
MSG 719278 TRIAL_RESULT 0
MSG 719279 UPDATE_JITTER_1
MSG 719283 -5 INSTRUCTIONS
MSG 719649 0 JITTER
MSG 719649 TRIALID 2
MSG 719665 RECCFG CR 1000 2 1 R
MSG 719665 ELCLCFG MTABLER
MSG 719665 GAZE_COORDS 0.00 0.00 1023.00 767.00
MSG 719665 THRESHOLDS R 105 226
MSG 719665 ELCL_PROC CENTROID (3)
MSG 719665 ELCL_PCR_PARAM 5 3.0
在所有这些行中,我选择的是其中包含“Congruent”或“Incongruent”的行。现在这里是实际数据行的示例:
719667 296.3 380.1 1165.0 ...
719668 296.0 379.9 1163.0 ...
719669 296.2 379.7 1161.0 ...
719670 296.5 379.3 1159.0 ...
719671 296.7 379.0 1160.0 ...
719672 296.9 378.8 1160.0 ...
现在假设这些行进行了2570次,2573次等。如果在这些行的末尾将“Congruent”识别为条件变量(标记为“END 719258 SAMPLES EVENTS RES 29.38 28.94”行),则将“一致”添加到此新列表中的次数等于试验的长度。如果“Incongruent”,则追加“Incongruent”次数。
答案 0 :(得分:0)
我不确定从trial_length
列表中选择号码的标准是什么。但原因是,在2570次之后重复20次是因为trial_length
数组中有20个元素。
在问题陈述的第3步中,您提到了Do step 2 a number of times equal to an integer in a separate list
。选择此整数的标准是什么?如果有标准,则用该逻辑替换for n in trial_length:
。
答案 1 :(得分:0)
您需要根据某些条件从trial_length中选择项目el。然后你可以做
for t in range(el):
condition.append(new_line)
答案 2 :(得分:0)
我认为你想使用iterator,因为你想用不同的行进行n
追加调用。听起来第一个'TEST'
行应使用trial_length[0]
,第二行应使用trial_length[1]
,依此类推。
currLength = iter(trial_length)
with open('test.asc','rw+') as foo:
for line in foo:
# Turn lines of file into individual lists
new_line = line.split()
# Select relevant lines
if len(new_line)==6 and new_line[4]=='TEST':
# Append new_line to "condition" a number of times
# equal to integer in "trial_length"
try:
n = next(currLength)
except StopIteration:
break
for t in range(0,n):
condition.append(new_line)
这将使您每次阅读trial_length
行时都使用'TEST'
中的新元素。 next()
要求迭代器为您提供序列中的下一个元素。当您用完元素时,调用next()
会引发StopIteration
例外。
这实际上是for
循环工作的方式。它们依赖于内部方法__iter__
。
如果您不需要检查特定条件的行,也可以使用enumerate()
。
答案 3 :(得分:0)
你可以通过使用类似的东西来避免调用追加N次
condition.extend(value for i in xrange(N))
答案 4 :(得分:-1)
它没有附加20次 它附加new_line 2570 + 2573 + .... + 2573 + 2570(51149)次 你只是希望它是2570次,而不是其余的
for t in range(trial_length[0]):
condition.append(new_line)