【问题标题】:Arranging the string of a list in a required format in python在python中以所需格式排列列表的字符串
【发布时间】:2012-07-26 12:43:21
【问题描述】:

其实我是用scrapy解析一些html页面,我使用xpath并从一些html标签中获取了一些地址,结果如下表

result = ["Hno 4-50, Plot No 301, Swathi Pooja Homes,Beside Rajadhani Theater, Vikas Nagar,Dilsukhnagar,Hyderabad","Mr Sravan"]

我想加入字符串所以我在下面做了

final_result = ','.join(result)

得到如下结果

final_result = "Hno 4-50, Plot No 301, Swathi Pooja Homes,Beside Rajadhani Theater, Vikas Nagar,Dilsukhnagar,Hyderabad,Mr Sravan"

在这里我们可以观察到final_result(地址)Mr Sravan 中的姓名在末尾,但通常姓名应该在任何联系人中的门或门牌之前,对吧?,所以与号码无关加入列表中的字符串后,我应该在开始时获得名称,有什么办法吗?谁能告诉我怎么做?

编辑代码:

目前我一次解析四个 url,所以当我使用 xpath(或相关)并从不同 url 获取地址并且结果(例如)如下每个 url 时

final_result = ['Addess_2','Newyork', 'Mr T.Jamal(Name)']
               ['Mr T. Jamal(Name)', 'Addres_1','Extra info'] 
               ['Addres_3','Mr T. Jamal(Name)','Extra info','Related scope'] 
               ['Addres_4','Extra info','Mr T. Jamal(Name)','Related info'] 
               ['Addres_5','Extra info','Related info']  # No name
               ['Addres_6','Extra info1','Related info1']  # No name

这里对于解析地址中的所有 url 要编写适用于上述所有列表的代码

【问题讨论】:

  • 如果“先生”不在列表中怎么办?此外,这是对原始问题的第三次重大更改.. 在某些时候您可能想发布一个新问题:)
  • 好的,这是最终的,我不会再更改问题,如果列表中没有名称只需要打印剩余的字符串。

标签: python list


【解决方案1】:

这样的事情怎么样:

  final_result = result[-1] + ', ' + ''.join(result[:-1])

屈服:

Mr Sravan, Hno 4-50, Plot No 301, Swathi Pooja Homes,Beside Rajadhani Theater, Vikas Nagar,Dilsukhnagar,Hyderabad

-- 更新--

这应该会在您的原始列表中的任何位置找到“先生”字符串,并使其按照您想要的方式工作。

rs = ','.join(result).split(',')
idx = [i for i,j in enumerate(rs) if j.strip().startswith('Mr')][0]
final_result = (rs[idx] +',' + ','.join(rs[1:idx] + rs[idx+1:])).strip()
print final_result

这适用于 OP 在更新帖子中提供的 4 个测试字符串

-- UPDATE 2 OP 更改问题,以便“先生”可能不在列表中--

此代码将检测 Mr 是否在列表中并将其移至前面。它还将检测它是否不在列表中并避免索引超出范围的情况。请参阅下面的输出。

测试字符串:

result = ['Addres_4','Extra info','Mr T. Jamal(Name)','Related info'] 
result = ['Addres_4','Extra info','T. Jamal(Name)','Related info'] 

代码:

rs = ','.join(result).split(',')
idx = [i for i,j in enumerate(rs) if j.strip().startswith('Mr')]

if len(idx) == 1:  # we found "Mr" in the list
    idx = idx[0]
    final_result = (rs[idx] +',' + ','.join(rs[1:idx] + rs[idx+1:])).strip()
else: # We didn't find "Mr" in the list .. adjust output to your needs
    final_result = (','.join(rs).strip())

print final_result

分别产生:

Mr T. Jamal(Name),Extra info,Related info
Addres_4,Extra info,T. Jamal(Name),Related info

【讨论】:

  • 如果我们不知道名字在列表中的位置怎么办,因为在获取名字的过程中,有时名字在列表的中间,并且肯定名字以 Mr 开头
  • @shivakrishna 我刚刚在你的 4 个测试字符串上运行了我的代码,并且成功了。
  • 当我运行我的完整代码时,但在 idx 有时 idx = [i for i,j in enumerate(rs) if j.strip().startswith('Mr')][0] 异常.IndexError: 超出范围的列表索引正在显示
  • @shivakrishna 这在您的 4 个测试字符串中都没有发生,对吧?确保您的列表中有一个“先生”。您能列出您遇到问题的列表吗?
  • @Levon:是的,你是对的(别介意我一直在问问题)现在的问题是有时列表中实际上没有名称,所以它的显示列表索引错误。对于带字符串的列表此方法运行良好,但以 Mr 开头的名称不存在,它将显示列表索引超出范围错误,对吗?
【解决方案2】:

你可以这样做:

final_result = ','.join(result[-1:] + result[:-1])


>>> 'Mr Sravan,Hno 4-50, Plot No 301, Swathi Pooja Homes,Beside Rajadhani Theater, Vikas Nagar,Dilsukhnagar,Hyderabad'

编辑: 根据您的评论,如果您知道该名称位于 i 的等级,则可以这样做:

result = ["is", "now", "the name", "at", "first", "place", ":)"]
i = 2
' '.join(result[i:i+1] + result[:i] + result[i+1:])
'the name is now at first place :)'

【讨论】:

  • 我认为如果名称字符串位于列表的末尾,这会起作用,但是如果名称在列表中混杂怎么办,我的意思是有时名称在列表中间,有时在末尾。 ...所以无论如何,名字都以先生开头
  • @shivakrishna 作为示例,您提供的列表中没有 middle 。它由两个字符串组成。是不是搞错了?
  • @shivakrishna 如果您知道名称的位置,可能会有所不同
  • 嘿,不,实际上答案是可以接受的,但我曾经告诉过我的问题,有时我在列表中有 4 个字符串,名称位于第 3 位,在这种情况下该怎么做,所以我很困惑.......
  • @Cédric Julien:是的,如果我们知道该领域的位置,上述情况是适用的,但有时 Sravan 先生的位置正在改变,所以我知道在这种情况下该怎么办
【解决方案3】:
def name_first(alist):
    """Get the part of the list that begins with 'Mr', then the rest."""
    for i, el in enumerate(alist):
        if el.startswith('Mr'):
            yield alist.pop(i)
            break
    for el in alist:
        yield el

【讨论】:

    猜你喜欢
    • 2016-03-22
    • 2012-07-05
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    相关资源
    最近更新 更多