【问题标题】:How to easy pass a single tuple to the startswith function from the list of tuples?如何从元组列表中轻松将单个元组传递给startswith函数?
【发布时间】:2014-05-02 01:03:56
【问题描述】:

我想在 Python 中实现搜索和替换字符串的功能。我编写了以下代码,但我的主要问题是将列表转换为元组。我在两个循环中实现了它,但是你能帮我以一种更简单的方式将元组传递给startswith 函数吗?(列表在rcsv_list 变量中)

rman_config = ('''
RMAN configuration parameters for database with db_unique_name TEST are:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
''')

rcsv_list = [('RETENTION POLICY', 'TO RECOVERY WINDOW OF 5 DAYS'), 
             ('CONTROLFILE AUTOBACKUP', 'ON'), 
             ('DEVICE TYPE', 'DISK PARALLELISM 4 BACKUP TYPE TO BACKUPSET')]

# unpack list of tuples to a single list
rcsv_tmp_list = []
for l in rcsv_list:
    for t in l:
        rcsv_tmp_list.append(t)

# convert list to tuple
rcsv_tuple = tuple(rcsv_tmp_list)

i = 0

for line in rman_config.splitlines():
    if line.startswith(rcsv_tuple, 10):
        line = 'CONFIGURE ' + rcsv_tuple[i] + ' ' + rcsv_tuple[i+1] + ';'
        i += 2
        print(line)
    else:
        print(line)

输出:

RMAN configuration parameters for database with db_unique_name TEST are:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 5 DAYS;
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE DEVICE TYPE DISK PARALLELISM 4 BACKUP TYPE TO BACKUPSET;

上述代码的主要思想是将一个元组传递给startswith 函数,以便在rman_config 字符串中进行搜索。为此,我创建了元组类型的rcsv_tuple 变量。这段代码运行良好,但最后我还有两个问题:

  1. 是否可以在不解包和隐藏变量的情况下简化上述代码?换句话说 - 如何从元组列表中将元组直接传递给startswith 函数? p>

  2. 在这种情况下还有其他方法可以搜索和替换字符串吗?

PS。我总是将 rcsv_list 变量作为元组列表,因为 -> Cursor.fetchall()

【问题讨论】:

  • 使用anyif any(e.startswith(tgt) for e in tup) 一样,从一个元组中创建一个列表,只需使用list(tup)

标签: python list tuples


【解决方案1】:

您可以将循环和元组的构造替换为:

rcsv_tuple = sum(rcsv_list, ())

您也很可能直接迭代查询的结果,而不是查询、拆分等:

cursor.execute(sql)
for row in cursor:
   # ...

最后,您可以消除 else 子句,因为您在打印时独立于条件。

【讨论】:

  • 太棒了!!我喜欢这样的聪明解决方案。 :) 谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-12-21
  • 2014-12-17
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多