将字符串附加到列表中的次数等于单独列表中的数字

时间:2014-02-21 19:32:56

标签: python for-loop nested

让它工作有点麻烦。如果问题格式不正确(或问题是愚蠢的简单),请道歉。新手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”次数。

5 个答案:

答案 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)