【问题标题】:Iterating over my list does not return value i was wating for迭代我的列表不会返回我正在等待的值
【发布时间】:2020-02-22 22:30:17
【问题描述】:

我正在通过 CSV 读取数据并将其中一个值存储到列表中。 当我尝试比较值时,结果发现列表迭代了一项。如果我打印列表,我可以看到列表的全部内容。但是,如果我在 for 循环 (for i in list:) 之后打印,我只会得到第一项,列表中有多少次,但总是相同的值。

def getMail(fname, lname):
    firstname = fname.split()
    lastname = lname.split()

    email = firstname[0].strip() + '.' + lastname[0].strip() + '@test.com'
    e_mails=[]

    with open('test-input.txt','r') as AD:
        rows = csv.DictReader(AD)

        for ad in rows:
            e_mails.append(ad['UserLogonName'])




    for i in e_mails:
        print(f'{i} and {email}')

         '''
             This is what i get when I print i and email. i expecxted i to be 
             an item on the list is stored.
             carlos.jimenez@test.com and Apolinar.Vargas-Morales@test.com
             carlos.jimenez@test.com and Antonio.Ochoa@test.com
             carlos.jimenez@test.com and Steven.Diaz@test.com
             carlos.jimenez@test.com and Jorge.Medrano@test.com
             carlos.jimenez@test.com and Daniel.Cerano@test.com
         '''


        print(e_mails)
        '''
           this is the content of my list from CSV
           ['carlos.jimenez@test.com', 'Carri.Dix@test.com', 'Alena.Azizi@test.com', 'Berna.Lagonaso@test.com', 'Christophe.deCarbonnieres@test.com', 'daniel.min@test.com', 'David.Li@test.com', 'John.Mitchell@test.com', 'Naveen.Sisodia@test.com', 'nadia.shakir@test.com', 'Sumeet.Sharma@smurfitkappa.com', 'benedicte.bar@test.com', 'Patricia.Aguirre@test.com']
        '''

        if email.lower() == i.lower():
            # print(f'{i} and {email}')

            print(len(firstname))

            if firstname ==2:
                email = firstname[0]+'.'+firstname[0][0:1]+'.'+lastname[0]+'@test.com'
                return email.lower()

            elif firstname ==1 :

                email = firstname[0]+'.'+firstname[0][0:1]+'.'+lastname[0]+'@test.com'
                return email.lower()
        else: 
            return email.lower() 




with open('users.csv') as csv_file:
    rows = csv.DictReader(csv_file)

    with open('users-COI2-Multi.csv', 'w', newline='') as output:
        header = ['FirstName','Initials','LastName','DisplayName','Description','Office','TelePhone','UserLogonName','SamAccountName','JobTitle','Department','Manager','Mobile','faxNumber','Notes','Assistant','employeeID','ex1','ex2','ex3','ex15','Office365License','ExpiresInDays','EmailToUSer','AddToGroup']

        output_file = csv.DictWriter(output, fieldnames=header, delimiter=';')
        output_file.writeheader()

        for data in rows:
            employeeId = data['Associate ID']
            fName = data['First Name']
            lName = data['Last Name']
            Location = data['Location']
            Department = data['Department']
            Manager = data['Manager Name']
            JobTitle = data['Title']

            context = {
                'FirstName' : fName,
                'Initials' : getInitials(fName, lName),
                'LastName' : lName,
                'DisplayName' : getDisplayName(fName, lName),
                'Description' : 'LMS Account for: '+getDisplayName(fName, lName),
                'Office': getOffice(Location).strip(),
                'TelePhone' : '+1 XXX XXX XXX',
                'UserLogonName' : getMail(fName, lName),
                'SamAccountName' : getSamA(fName, lName),
                'JobTitle' : JobTitle,
                'Department' : Department,
                'Manager' : Manager,
                'Mobile' : '',
                'faxNumber' : '',
                'Notes' : '',
                'Assistant' : '',
                'employeeID' : employeeId,
                'ex1' : 'End User',
                'ex2' : 'NoMailbox',
                'ex3' : getSiteCode(Location),
                'ex15' : getSKID(Location),
                'Office365License' : '',
                'ExpiresInDays' : '',
                'EmailToUSer' : 'victor.u.reyes@test.com',
                'AddToGroup' : '',
            }
            output_file.writerow(context)

【问题讨论】:

  • @ThomasWeller 我的代码中有另一个循环是我如何生成输出 CSV

标签: python python-3.x list list-comprehension


【解决方案1】:

罪魁祸首是这个返回语句:

return email.lower() 

getmail() 函数的末尾。它将适用于 99% 的情况(只要 if email.lower() == i.lower(): 不是 True),过早结束搜索。

我不明白你要开发的应用的具体业务规则,但我猜这个功能应该是

def getMail(fname, lname):
    [...]

    for i in e_mails:
        [...]

        if email.lower() == i.lower():
            [...]
                               # removed else here
     return email.lower()      # outdent here

另一种选择是

        elif firstname ==1 :

            email = firstname[0]+'.'+firstname[0][0:1]+'.'+lastname[0]+'@test.com'
            return email.lower()
        else:                      # indent here
            return email.lower()   # indent here

另请注意:if firstname ==2:if firstname ==1: 这两个案例在我看来是一样的。我想这不是故意的。

【讨论】:

  • 所以我正在尝试验证我构建的电子邮件与来自 CSV 文件的电子邮件列表。我仍然需要处理 `for i in e_mails:` 之后的分类逻辑:逻辑是如果电子邮件在列表中,并且名字的第一个字母在中间,如果用户有 2 个名字,则将 s 的第一个字母中间示例中的第二个名称(victor.reyes@test.com 已存在创建 victor.v.reyes@test.com)。但我无法进入该逻辑,因为我的 for 循环返回了我列表中的相同项目......因为不是真的它会返回所有未检查的电子邮件
  • 那么firstname == 1 部分就坏了。如果 Victor 只有一个名字,你还要添加 .v
  • 是的,我仍然需要努力。问题是我的代码没有进入该部分进行测试,因为我不断收到相同的电子邮件
  • 好的。嗯,你看我的回答了吗?我有 2 个可能的解决方案供您参考。
  • 成功了。谢谢你,现在我得把支票弄对了
猜你喜欢
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 2014-09-01
  • 2020-03-13
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多