【问题标题】:Is there a better way to loop over multiple unknown variables in a for loop?有没有更好的方法在 for 循环中循环多个未知变量?
【发布时间】:2017-02-15 17:00:50
【问题描述】:

所以我有这个任务,我想打印到一个文本文件。该文件包括标题信息和具有特定名称的数据列。代码如下:

import numpy as np

data={'dpr_NS_corZFac': [np.nan, np.nan, 35.736231803894043, 36.331412792205811,
               35.694644451141357, 36.576189994812012, 37.236752510070801,
               38.173699378967285, 38.808069229125977, 36.761274337768555,
               30.194313526153564],
    'dpr_HS_corZFac': [np.nan, 38.550984859466553, 37.893826961517334, 40.246520042419434,
             39.204437732696533, 37.227160930633545, 37.364296913146973,
             40.320019721984863, 39.04454231262207, 33.014707565307617,
             27.193448543548584],
    'npol':[np.nan, np.nan, 35.736231803894043, 36.331412792205811,
               35.694644451141357, 36.576189994812012, 37.236752510070801,
               38.173699378967285, 38.808069229125977, 36.761274337768555,
               30.194313526153564] }

datafile_path = '/home/cpabla/data/pandastext.txt'

with open(datafile_path, 'w+') as f:
    f.write('Charanjit is writing this text file.')
    f.write('\t'*4)
    f.write('He continues to write....\n')
    for tag in data:
        f.write('{}\t\t'.format(tag))
    f.write('\n')
    for val1, val2, val3 in zip(data['dpr_NS_corZFac'], data['dpr_HS_corZFac'], data['npol']):
        if np.isnan(val1): val1 = 99.99
        if np.isnan(val2): val2 = 99.99
        if np.isnan(val3): val3 = 99.99
        f.write('{:.2f}'.format(val1))
        f.write('\t'*7)
        f.write('{:.2f}'.format(val2))
        f.write('\t'*7)
        f.write('{:.2f}'.format(val3))
        f.write('\t'*7)
        f.write('\n')

代码的细节并不重要,因为这只是为了我的测试。注意我有一个列表字典。我将在字典中有未知数量的列表,并且我想生成示例输出中给出的 for 的文本文件。但是,请注意我是如何遍历多个变量的(在本例中是我的字典中的列表)。我显然想自动化这个,所以我不必继续向 for 循环添加变量。那么有没有更好的方法来做到这一点?

这是输出:

Charanjit is writing this text file.                He continues to write....
dpr_HS_corZFac      dpr_NS_corZFac      npol
99.99                           99.99                           99.99
99.99                           38.55                           99.99
35.74                           37.89                           35.74
36.33                           40.25                           36.33
35.69                           39.20                           35.69
36.58                           37.23                           36.58
37.24                           37.36                           37.24
38.17                           40.32                           38.17
38.81                           39.04                           38.81
36.76                           33.01                           36.76
30.19                           27.19                           30.19

然而,文本编辑器的实际输出不是这样的。每列都有自己的标题名称,这正是我想要的。输出只是为了向您展示我正在尝试做的事情。

【问题讨论】:

  • 可能你想要zip(data.values())
  • @juanpa.arrivillaga 那么它们不会按任何特定顺序排列。
  • 是的,顺序对我来说很重要。我希望它是我在字典中定义数据的方式。
  • 好吧,那么您的两个选择是硬编码或使用OrderedDict

标签: python for-loop


【解决方案1】:
import numpy as np 

data={'dpr_NS_corZFac': [np.nan, np.nan, 35.736231803894043, 36.331412792205811, 
               35.694644451141357, 36.576189994812012, 37.236752510070801, 
               38.173699378967285, 38.808069229125977, 36.761274337768555, 
               30.194313526153564],
    'dpr_HS_corZFac': [np.nan, 38.550984859466553, 37.893826961517334, 40.246520042419434, 
             39.204437732696533, 37.227160930633545, 37.364296913146973, 
             40.320019721984863, 39.04454231262207, 33.014707565307617, 
             27.193448543548584],
    'npol':[np.nan, np.nan, 35.736231803894043, 36.331412792205811, 
               35.694644451141357, 36.576189994812012, 37.236752510070801, 
               38.173699378967285, 38.808069229125977, 36.761274337768555, 
               30.194313526153564] }

datafile_path = r'D:\TEMP\pandastext.txt'

with open(datafile_path, 'w+') as f:
    f.write('Charanjit is writing this text file.')
    f.write('\t'*4)
    f.write('He continues to write....\n')
    for tag in data:
        f.write('{}\t\t'.format(tag))
    f.write('\n')
    for vals in zip(data['dpr_NS_corZFac'], data['dpr_HS_corZFac'], data['npol']):
        for val in vals:
            if np.isnan(val): val = 99.99
            f.write('{:.2f}'.format(val))
            f.write('\t'*7)
        f.write('\n')

【讨论】:

  • 我的答案与上面的答案相似......除了我认为应该在内部循环之外的 f.write('\n')
【解决方案2】:

一个解决方案可能是:

for k in data.keys():
    for val in data[k] :
        if np.isnan(val): val = 99.99
            f.write('{:.2f}'.format(val))
            f.write('\t'*7)
        f.write('\n')

编辑:你是对的 Akasolace,我已经编辑了我的代码

【讨论】:

  • 不要遍历data.keys()。它在 Python 3 中只是多余的。在 Python 2 中,它的效率较低。使用for key in data:,尽管在这种情况下您可能需要for sublist in data.values()
【解决方案3】:

你会用熊猫吗?

这里:

In [50]: import pandas as pd

In [48]: pd.set_option('precision', 2)

In [51]: df = pd.DataFrame(data)

In [52]: df
Out[52]:
    dpr_HS_corZFac  dpr_NS_corZFac   npol
0              NaN             NaN    NaN
1            38.55             NaN    NaN
2            37.89           35.74  35.74
3            40.25           36.33  36.33
4            39.20           35.69  35.69
5            37.23           36.58  36.58
6            37.36           37.24  37.24
7            40.32           38.17  38.17
8            39.04           38.81  38.81
9            33.01           36.76  36.76
10           27.19           30.19  30.19


In [56]: df.replace(np.NaN, 99.99, inplace=True)

In [57]: print df.to_string()
    dpr_HS_corZFac  dpr_NS_corZFac   npol
0            99.99           99.99  99.99
1            38.55           99.99  99.99
2            37.89           35.74  35.74
3            40.25           36.33  36.33
4            39.20           35.69  35.69
5            37.23           36.58  36.58
6            37.36           37.24  37.24
7            40.32           38.17  38.17
8            39.04           38.81  38.81
9            33.01           36.76  36.76
10           27.19           30.19  30.19

In [58]:

写入文件(待完成)

In [59]: with open(r'C:\temp\data.txt', 'w') as f:
             f.write("Whatever you want here")
    ...:     f.write(df.to_string(index=False))
    ...:

【讨论】:

  • 是的,我试过了。但是我将如何添加我在我的版本中的标题?例如,Charanjit 正在编写这个文本文件....
  • 这似乎工作得很好。有没有办法删除这些索引或用其他东西替换它们?
  • 是的...已编辑。你也可以调用 .to_string(index=False, buf=f)
  • 所以这一切都有效。问题是,一旦我到达文本文件的边缘,列就会开始填充到第一列下方。不知何故,python认为文本文件的边缘没有空间,但应该有办法处理这个问题。有什么建议么? - 更新:没关系,我找到了罪魁祸首。在文本软件中,“自动换行”需要取消选中。
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 2012-10-28
  • 2015-04-28
  • 2014-06-12
  • 1970-01-01
  • 2020-06-21
  • 2022-12-14
  • 1970-01-01
相关资源
最近更新 更多